<
디자인 패턴 - 싱글톤 패턴
>
🌠다음 포스팅🌠

디자인 패턴 - 전략 패턴
☄이전 포스팅☄

디자인 패턴 - 데코레이터 패턴
스프링이 가지는 대표적인 디자인 패턴에 대해 알아보자

🚀 스프링에서 디자인 패턴의 중요성

디자인 패턴은 실제 개발 현장에서 비즈니스 요구 사항을 프로그래밍으로 처리하면서 만들어진 다양한 해결책 중에서 많은 사람들이 인정한 가장 효율적인 예시를 정리한 패턴의 집합이다.

🌠 싱글톤 패턴 - 개방 폐쇄 원칙(OCP), 의존 역전 원칙(DIP)

커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러개 만들게 되면 불필요한 자원을 사용하게 된다.

여기서 싱글톤 패턴을 적용하여 하나의 인스턴스를 만들어 사용하기 위한 패턴이다.

단일 객체를 사용하는 패턴인 만큼 의미상 두개의 객체가 존재할 수 없으며, 이를 구현하기 위한 new에 재약을 걸어야 하고, 만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다.

007

싱글톤 패턴 - 적용 후

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 테스트 코드가 수행 되도록 합니다.

CellPhone.java

public class CellPhone {

    private static int serialNum = 1000;
    int cellPhoneNum;

    public CellPhone()
    {
        serialNum++;
        cellPhoneNum = serialNum;
    }

    public int getCellPhoneNum() {
        return cellPhoneNum;
    }

}

CellPhoneFactory.java

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;
    }
}

CellPhoneFactoryTest.java

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 출력
    }
}

🌠 정리

클래스의 인스턴스 객체를 하나만 만들어 사용하는 패턴

🧾 Reference

Top
Foot