본문 바로가기

디자인 패턴/Java언어로 배우는 디자인패턴 입문 책 정리

Abstract Factory 패턴

추상 팩토리, 추상 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