디자인 패턴
은 실제 개발 현장에서 비즈니스 요구 사항을 프로그래밍으로 처리하면서 만들어진 다양한 해결책 중에서 많은 사람들이
인정한 가장 효율적인 예시를 정리한 패턴의 집합이다.
커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러개 만들게 되면 불필요한 자원을 사용하게 된다.
여기서 싱글톤 패턴
을 적용하여 하나의 인스턴스를 만들어 사용하기 위한 패턴이다.
단일 객체를 사용하는 패턴인 만큼 의미상 두개의 객체가 존재할 수 없으며,
이를 구현하기 위한 new
에 재약을 걸어야 하고, 만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다.
new
를 실핼할 수 없도록 생성자에 private 접근 제어자를 지정한다.public class Singleton {
static Singleton singletonObject; // 정적 참조 변수
// 생성자를 private으로 선언하면서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
private Singleton() {}
// 객체 반환 정적 메서드 new 대신에 getInstance() 메소드로 호출한다.
public static Singleton getInstance() {
if (singletonObject == null) {
singletonObject = new Singleton();
}
return singletonObject;
}
}
public class Client {
public static void main(String[] args) {
// private 생성자임으로 new 할 수 없다.
// Singleton s = new Singleton();
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
Singleton s3 = Singleton.getInstance();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
s1 = null;
s2 = null;
s3 = null;
}
}
휴대폰 공장이 있습니다. 휴대폰 공장은 유일한 객체이고, 이 공장에서 생산되는 자동차는 제작될 때마다 고유의 번호가 부여됩니다.
휴대폰 번호가 10001부터 시작되어 휴대폰이 생산될 때마다 10002, 10003 이렇게 번호가 붙도록 휴대폰 공장 클래스, 휴대폰 클래스를 구현하세요
다음 CellPhoneFactoryTest.java 테스트 코드가 수행 되도록 합니다.
public class CellPhone {
private static int serialNum = 1000;
int cellPhoneNum;
public CellPhone()
{
serialNum++;
cellPhoneNum = serialNum;
}
public int getCellPhoneNum() {
return cellPhoneNum;
}
}
public class CellPhoneFactory {
// 클래스 내부에 유일한 private 인스턴스 생성
private static CellPhoneFactory instance = new CellPhoneFactory();
// 생성자를 private으로 선언하면서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
private CellPhoneFactory() {
}
// 외부에서 유일한 인스턴스를 참조할 수 있는 public 메서드 제공
public static CellPhoneFactory getInstance() {
if(instance == null) {
instance = new CellPhoneFactory();
}
return instance;
}
public CellPhone createCellPhone() {
CellPhone cellPhone = new CellPhone();
return cellPhone;
}
}
public class CellPhoneFactoryTest {
public static void main(String[] args) {
CellPhoneFactory factory = CellPhoneFactory.getInstance();
CellPhone myGalaxy = factory.createCellPhone();
CellPhone yourIphone = factory.createCellPhone();
System.out.println(myGalaxy.getCellPhoneNum()); //10001 출력
System.out.println(yourIphone.getCellPhoneNum()); //10002 출력
}
}
클래스의 인스턴스 객체를 하나만 만들어 사용하는 패턴
getInstance() 정적 메서드
를 갖는다.