본문 바로가기

IT/디자인 패턴

[Design Pattern] 추상 팩토리 패턴(Abstract factory pattern)

팩토리 메소드 패턴
객체의 생성을 팩토리 클래스로 위임하여 객체를 생성하는 패턴

추상 팩토리 패턴
팩토리를 추상화해서 관련있는 객체의 집합을 생성할 수 있는 팩토리를 만들고 조건에 따라 팩토리를 생성해서 서로 관련된 객체를 생성하는 패턴 

 

JAVA 소스 예제

public abstract class Phone {

    public abstract void power();
}

public class SamsungPhone extends Phone {

    @Override
    public void power() {
        System.out.println("samsung phone power on");
    }

}

public class ApplePhone extends Phone {

    @Override
    public void power() {
        System.out.println("apple phone power on");
    }

}
SamsungPhone 클래스와 ApplePhone 클래스는 Phone 추상클래스를 상속하고 power() 메소드를 오버라이딩한다.

 

public interface PhoneFactory {

    public Phone create();
}

public class ApplePhoneFactory implements PhoneFactory {

    @Override
    public Phone create() {
        return new ApplePhone();
    }

}

public class SamsungPhoneFactory implements PhoneFactory {

    @Override
    public Phone create() {
        return new SamsungPhone();
    }

}
ApplePhoneFactory 클래스와 SamsungPhoneFactory 클래스는 PhoneFactory를 상속하고 create()메소드를 오버라이딩한다.
create() 메소드는 각각 팩토리 클래스 별로 제조사에 맞는 Phone 클래스를 반환한다.

 

public enum PhoneType {
    SAMSUNG, APPLE
}

public class Main {

    public static void main(String[] args) {
        PhoneFactory phoneFactory = null;
        PhoneType phoneType = PhoneType.SAMSUNG;

        switch (phoneType) {
            case SAMSUNG:
                phoneFactory = new SamsungPhoneFactory();
                break;
            case APPLE:
                phoneFactory = new ApplePhoneFactory();
                break;
            default:
                throw new RuntimeException(phoneType.toString() + " is not existed");
        }

        Phone phone = phoneFactory.create();
        phone.power();

    }

}
enum 타입인 phoneType 별로 PhoneFactory를 생성하고 create() 메소드를 실행한 뒤, phone의 power() 메소드를 실행한다.
phoneType 별로 생성되는 Factory가 바뀌어서 생성되는 phone 또한 바뀌는 것을 볼 수 있다.