카테고리 없음
디자인 패턴 - 생성패턴 -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를 구현하며, 확장성에 용이하며, 구현시에 인터페이스를 주입받아 객체를 생성하기에 구현하기에 어렵지 않습니다