프로그래밍/Design Pattern

Design Pattern을 공부해보자 2탄

seungdols 2016. 8. 30. 17:31

Design Pattern을 공부해보자

추상 팩토리 패턴


서로 연관된 또는 의존적인 객체들로 이루어진 제품군을 생성하기 위한 인터페이스를 제공한다. 구상 클래스는 서브 클래스에 의해 만들어 진다.

추상 팩토리 패턴은 예시 코드로 치면, 먼저 피자의 지점에 따른 피자가 공통적인 피자라는 점에는 같지만, 속재료에 차이에 대해 집중하는 편이다. 그런 점에서 팩토리 메소드 패턴과는 다르다. 물론, 이용할 수는 있으나, 결론적으로 차이는 추상 팩토리 패턴은 상속을 통한 확장이 아닌, Composition을 통해 확장을 해나가는 패턴이다.

추상 팩토리 패턴 코드

팩토리 메소드 패턴



객체를 생성하기 위한 인터페이스를 만든다. 어떤 클래스의 인스턴스를 만들지는 서브 클래스에서 결정하도록 합니다. 팩토리 메소드를 이용하면 인스턴스를 만드는 일을 서브 클래스로 미룰 수 있다.

둘의 차이가 명백하게 보이진 않는다. 이에 대해 좀 더 봐야 할 것 같다.

특히나, 추상 팩토리 패턴에서 팩토리 메소드 패턴을 이용하기도 하기 때문에 둘 사이의 차이는 상속을 통한 확장이냐? 구성을 통한 확장이냐?에 차이가 있다.

추상 팩토리 패턴의 경우 인터페이스에 수정이 필요한 경우 모든 코드에 있어서 적용을 해야 한다.
Java8의 Default 메소드라면 모를까..결론적으로 jdk8이전이라면, 인터페이스를 구현한 모든 코드의 수정이 이루어져야 한다.

팩토리 메소드 패턴 코드

고전적인 싱글톤 패턴


public class Singleton {

    //싱글톤 클래스의 유일한 인스턴스를 저장 할 정적 변수

    private static Singleton uniqueInstance;

    private Singleton() {

    }

    public static Singleton getInstance(){

        if(uniqueInstance == null){

            uniqueInstance = new Singleton();

        }

        return uniqueInstance;

    }

}

하지만, 다중 쓰레드 환경이라면, 문제가 될 수 있다.

방안 1 ) Synchronized를 사용


public static synchronized Singleton getInstance(){

    if(uniqueInstance == null){

        uniqueInstance = new Singleton();

    }

    return uniqueInstance;

}

}

단, Java 진영에서 동기화 키워드 사용은 굉장한 성능 저하를 불러 일으키며, 좋지 않은 방안이다.

Q) Synchronized를 사용하는 것이 어떻게 좋지 않은 영향을 주는지에 대해 찾아봐야겠다.

방안 2 )


public class Singleton {

    //싱글톤 클래스의 유일한 인스턴스를 저장 할 정적 변수

    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {

    }

    public static synchronized Singleton getInstance(){



        return uniqueInstance;

    }

}

처음부터 만들어 버리는 방법도 있으나, JVM에서 해당 인스턴스를 만들기 전까지 접근이 불가능하다.

방안 3 )


public class Singleton {

    //싱글톤 클래스의 유일한 인스턴스를 저장 할 정적 변수

    private volatile static Singleton uniqueInstance;

    private Singleton() {

    }

    public static synchronized Singleton getInstance(){

        if(uniqueInstance == null){

            synchronized (Singleton.class){

                if(uniqueInstance == null){

                    uniqueInstance = new Singleton();

                }

            }

        }

        return uniqueInstance;

    }

}

volatile 키워드와 동기화 블럭을 이용하여 처음에만 동기화를 진행하고, 그 이후에는 인스턴스를 리턴하는 형식으로 사용할 수 있다.

싱글톤 패턴 코드


반응형