Notice
Recent Posts
Recent Comments
Link
개발 무지렁이
[Java] 디자인 패턴 中 생성패턴, 싱글톤(Singleton) 패턴 본문

📌. 디자인 패턴
: 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 설계상의 문제해결방법을 말한다.
: 개발자 사이에서 공유되고, 사용되는 검증된 솔루션이다.
🧩일관성, 🧩유지보수성, 🧩재사용성을 높인다.
: 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 설계상의 문제해결방법을 말한다.
: 개발자 사이에서 공유되고, 사용되는 검증된 솔루션이다.
🧩일관성, 🧩유지보수성, 🧩재사용성을 높인다.
🥥. 생성패턴 in 디자인패턴
:객체 생성과정을 유연하게 다룰 수 있다.
객체의 개수를 제어하는 싱글톤 패턴
외부에서 사용자가 직접 객체를 생성하지 못하게 한다.
(🃏 개발자가 주는대로만 쓰게끔)
(1) 'private 생성자'를 만들고,
(2) '멤버필드를 하나만 생성'하고,
(3) '가져다 쓸 수 있는 메서드'를 만든다
☝️ (백번호출해도) '하나만 만들어놓고 공유'해서 쓰는 형태
class Singleton {
private static Singleton instance = new Singleton();
private Singleton() { }
public static Singleton getInstance() { // 현재 객체내에서 자신을 생성해서 리턴해주는 메서드 제공, 외부에서 객체를 생성하지 않고 메서드에 접근할 수 있게끔 static
return instance;
}
}
// new Singleton(); No!! 외부에서 객체 생성 안됨
// Singleton single = Singleton.getInstance();
public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
Singleton s3 = Singleton.getInstance();
System.out.println("s1: " + s1);//s1: hello_java_world.Singleton@2ff4acd0
System.out.println("s2: " + s2);//s2: hello_java_world.Singleton@2ff4acd0
System.out.println("s3: " + s3);//s3: hello_java_world.Singleton@2ff4acd0
}
}
객체의 개수가 꼭 하나가 아니어도 된다.
❓ 구청에 민원이 500개 들어왔다고 하자.. 창구직원(객체)이 500명 있어야할까?
-> '객체의 개수'를 '제한'하는 것이 핵심!!
[싱글톤.java]
class 창구직원 {
public static 창구직원 a창구직원;
private 창구직원() {
// 외부에서 new를 통한 객체 생성 불가능
}
public 창구직원 get창구직원() {
if(a창구직원 == null) { // 객체가 없을 때
a창구직원 = new 창구직원(); // 하나의 객체만 만든다
}
return a창구직원 // 객체가 이미 하나 있을 때, 기존 창구직원 재탕
}
}
[창구직원을 3명만 두고 재탕하는 구조.java]
class 창구직원 {
private int id;
private static 창구직원 a마지막_창구직원;
private static int lastId;
static { // static 전용 생성자, 클래스가 로딩될 때 실행
a마지막_창구직원 = null;
lastId = 0;
}
private 창구직원(int id) {
this.id = id;
}
public static 창구직원 get창구직원() {
if(lastId == 3) { // 창구직원(객체)을 제한, 싱글톤
return a마지막_창구직원; // 재탕
}
int id = ++lastId;
창구직원 a창구직원 = new 창구직원(id);
a마지막_창구직원 = a창구직원;
return a창구직원;
}
public void 자기소개() {
System.out.printf("저는 %d번 창구직원입니다\n", id);
}
}
class Main {
public static void main(String[] args) {
창구직원[] 창구 = new 창구직원[7]; // 7개의 창구직원 자리가 있는 구청
창구[0] = 창구직원.get창구직원(); // new 창구직원(1);
창구[1] = 창구직원.get창구직원(); // new 창구직원(2);
창구[2] = 창구직원.get창구직원(); // new 창구직원(3);
창구[3] = 창구직원.get창구직원(); // a마지막_창구직원 재탕
창구[4] = 창구직원.get창구직원(); // a마지막_창구직원 재탕
창구[5] = 창구직원.get창구직원(); // a마지막_창구직원 재탕
창구[6] = 창구직원.get창구직원(); // a마지막_창구직원 재탕
for(int i = 0; i < 창구.length; i++) {
창구[i].자기소개();
}
/* 출력
저는 1번 창구직원입니다.
저는 2번 창구직원입니다.
저는 3번 창구직원입니다.
저는 3번 창구직원입니다.
저는 3번 창구직원입니다.
저는 3번 창구직원입니다.
저는 3번 창구직원입니다.
*/
}
}
'Backend > 자바' 카테고리의 다른 글
[Java] 자바와 서블릿(Servlet), PHP, JSP (0) | 2022.12.09 |
---|---|
[Java] 미완성과 추상성 (클래스) (0) | 2022.12.07 |
[Java] 옵저버(Observer) 패턴 (0) | 2022.12.03 |
[Java] 컴파일 언어 Java와 JVM (0) | 2022.12.01 |
[Java] 디자인패턴 中 생성패턴, 팩토리 메서드(Factory method) 패턴 (0) | 2022.11.28 |