추상 팩토리, 추상 product를 이용한 패턴
실제 구현부분에는 추상 팩토리와 추상 product만 이용, 구체적인 객체는 추상 팩토리를 생성할 때만 명시
1. 코드
AbstractFactory: 추상 팩토리
public abstract class AbstractFactory {
public static AbstractFactory getFactory(FactoryType factoryType) {
String className = factoryType.name();
AbstractFactory factory = null;
try {
factory = (AbstractFactory) Class.forName(className).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return factory;
}
public abstract AbstractPrint1 createPrint1();
public abstract AbstractPrint2 createPrint2();
}
AbstractPrint1: 추상 product - print1
public abstract class AbstractPrint1 {
public abstract void print();
}
AbstractPrint2 : 추상 product - print2
public abstract class AbstractPrint2 {
public abstract void print();
}
AFactory : 구체적인 factory1
public class AFactory extends AbstractFactory {
@Override
public AbstractPrint1 createPrint1() {
return new APrint1();
}
@Override
public AbstractPrint2 createPrint2() {
return new APrint2();
}
}
APrint1 : AFactory에서 만들어지는 구체적인 product1 - print1
public class APrint1 extends AbstractPrint1 {
@Override
public void print() {
System.out.println("A1");
}
}
APrint2 : AFactory에서 만들엊디는 구체적인 proudct2 - print2
public class APrint2 extends AbstractPrint2 {
@Override
public void print() {
System.out.println("A2");
}
}
BFactory : 구체적인 factory1
public class BFactory extends AbstractFactory {
@Override
public AbstractPrint1 createPrint1() {
return new BPrint1();
}
@Override
public AbstractPrint2 createPrint2() {
return new BPrint2();
}
}
BPrnit1 : BFactory에서 만들어지는 구체적인 product1 - print1
public class BPrint1 extends AbstractPrint1 {
@Override
public void print() {
System.out.println("B1");
}
}
BPrint2 : BFactory에서 만들어지는 구체적인 product2 - print2
public class BPrint2 extends AbstractPrint2 {
@Override
public void print() {
System.out.println("B2");
}
}
FactoryType : factory를 선택할 때 string보다 안전하게 생성하기 위한 enum
public enum FactoryType {
AFactory, BFactory
}
Main : test 클래스
public class Main {
public static void main(String[] args) {
AbstractFactory factory = AbstractFactory.getFactory(FactoryType.AFactory);
AbstractPrint1 f1Print1 = factory.createPrint1();
AbstractPrint2 f1Print2 = factory.createPrint2();
f1Print1.print();
f1Print2.print();
AbstractFactory factory2 = AbstractFactory.getFactory(FactoryType.BFactory);
AbstractPrint1 f2Print1 = factory2.createPrint1();
AbstractPrint2 f2Print2 = factory2.createPrint2();
f2Print1.print();
f2Print2.print();
}
}
2. 특징
- main함수 내에 실제 class는 없고 모두 추상 클래스로만 구성
- getFactory의 factory명만 바꾸면 동일한 코드에서 다른 결과물을 얻을 수 있음
- 모든 실제 구현체들이 같은 기능들(print1, print2)를 구현해야함
- 기능들이 추가될 때마다 모든 구현체들에서 기능이 추가되야함
- 팩토리와 product클래스가 한 쌍임 (즉, AFactory를 썼다면 자동으로 APrint1, APrint2가 사용됨)
- 잘못 매핑할 확률을 줄임
- 유연하게 print1은 APrint1, print2는 BPrint2를 호출하는 factory도 생성가능
3. 해당 패턴을 고려해볼만한 상황
- 같은 기능이지만 여러 상황에 따라 output이 다를 경우
'디자인 패턴 > Java언어로 배우는 디자인패턴 입문 책 정리' 카테고리의 다른 글
strategy 패턴 (0) | 2021.01.24 |
---|---|
Bridge 패턴 (0) | 2021.01.17 |
Builder 패턴 (0) | 2021.01.09 |
Prototpye 패턴 (0) | 2021.01.03 |
Singleton 패턴 (0) | 2021.01.01 |