카테고리 없음

디자인 패턴 - 생성패턴 -Abstaract Factory

yoon9 2022. 6. 12. 18:04

디자인패턴 생성패턴의 종류

 

-Factory Method

-Abstaract Factory

-Builder

-Singleton

-ProtoType

 

이전에 다룬 Factory Method else-if switch-case를 사용하여서 서브클래스의 객체를 생성을 하였습니다.

하지만, -Abstaract Factory 패턴에서는 달리 else-if switch-case 없애고 전에 글과 달리 

 

public class PhoneFactory {


    public  Phone getPhone(String company){

        switch (company){
            case "apple":
                return new Iphone("Iphone", "128G");

            case "samsung":
                return new SamsungPhone("samsung","258G");
            default:
                return null;
        }

    }
}
public class PhoneFactoryTest {

    public static void main(String args[]){
        PhoneFactory pf = new PhoneFactory();

        Phone ip = pf.getPhone("apple");
        System.out.println(ip.getPhoneName());

        Phone ss = pf.getPhone("samsung");
        System.out.println(ss.getPhoneName());
    }


}

위의 부분이 "apple"과 "samsung"이라는 값으로 식별을 하여서 구분하는 부분이 사라지고 매개변수로 AbstractFactory를 구현한 factory클래스를 받아서 원하는객체를 만듭니다.

즉, 원래는 하나의 factory에서 하는 것이 아니라  factory 또한 구현하여, 객체를 만듭니다.

 

 

 

 

 

 

변경된 PhoneFactory.java

public class PhoneFactory {
    public static Phone getPhone(AbstractPhoneFactory abstractPhoneFactory){
        return abstractPhoneFactory.createPhone();
    }
}

 

추가되는 AbstractPhoneFactory.java

public interface AbstractPhoneFactory {

    Phone createPhone();
}

추가되는 IPhoneFactory.java

public class IPhoneFactory implements AbstractPhoneFactory{




    @Override
    public Phone createPhone() {
        return  new Iphone("Iphone","128G");
    }
}

추가되는 SamsungPhoneFactory.java

public class SamsungPhoneFactory implements AbstractPhoneFactory {
    @Override
    public Phone createPhone() {
        return new SamsungPhone("SamsungPhone","256G");
    }
}

변경된 PhoneFactoryTest.java

public class PhoneFactoryTest {

    public static void main(String args[]){




        //abstract method pattern
        Phone iphone = PhoneFactory.getPhone(new IPhoneFactory());
        Phone samsungPhone = PhoneFactory.getPhone(new SamsungPhoneFactory());

    }


}

정리를 하자면, 각각 factory를 구현하며, 확장성에 용이하며, 구현시에 인터페이스를 주입받아 객체를 생성하기에 구현하기에 어렵지 않습니다