추상팩토리패턴(Abstract Factory Pattern)
추상팩토리패턴(Abstract Factory Pattern)
추상팩토리 패턴은 많은 수의 연관된 서브 클래스를 특정 그룹으로 묶어 한번에 교체할 수 있도록 만든 디자인패턴이다. 대표적인 예로는 특정 라이브러리를 배포할 때 OS별로 지원하는 기능이 다르다면 추상 팩토리 패턴을 사용해 OS별 기능 변경을 통합적으로 변경할 수 있다.
이처럼 추상팩토리 패턴은 다양한 구성 요소 별로 "객체의 집합"을 생성해야 할 때 유용한 패턴이다. 다시 말해서, 서로의 다른 객체들을 하나의 팩토리에서 생성과 관리를 한다고 보면된다. 하나의 인터페이스에서 객체의 생성을 처리하고, 다양한 성격의 객체를 하나의 군으로 형성해 그것을 객체 단위로 취급하여 생성해야할 때 유용한 패턴이다.
예시를 통해 다시 공부해보자. 실제 공장을 생각하면서 코드를 실행해 본다. 실제 제과점공장이 있다고 할 때 케익을 만드는 기계이 있고, 케익과 함께 먹을 음료를 만드는 기계가 있다고 가정을 한다. 그리고 이 제품을 만드는 공장들이 있다고할 때 다양한 제품들을 만들어 내는 곳은 이 공장에서 만들어진다. 이 예시를 코드를 통해 확인해보자.
[클래스다이어그램]
케익을 만드는 기계와 음료를 만드는 기계가 있고, 각각의 다른 구성들을 가지고 있다. 이를 생산하는 공장에서 이들 구성 중에 특정 객체를 생성해서 하나의 집합을 생산할 수 있다. 추상팩토리의 특징인 다양한 성격의 객체를 하나의 군으로 형성해 그것을 객체 단위로 취급하여 생성할 수 있도록한다.
[소스코드]
[CakeMachine : Product1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public interface CakeMachine { public void process(); } public class CheeseCakeMachine implements CakeMachine{ @Override public void process() { System.out.println( "치크케익을 만들어요" ); } } public class CreamCakeMachine implements CakeMachine{ @Override public void process() { System.out.println( "생크림케이크를 만들어요" ); } } |
[BeverageMachine : Product2]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public interface BeverageMachine { public void process(); } public class CoffeeMachine implements BeverageMachine { @Override public void process() { System.out.println( "커피를 만들어요" ); } } public class MilkMachine implements BeverageMachine { @Override public void process() { System.out.println( "우유를 만들어요" ); } } |
[MachineFactory : Abstract Factory]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public interface MachineFactory { public CakeMachine getCakeMachine(); public BeverageMachine getBeverageMachine(); } public class MachineFactoryA implements MachineFactory{ @Override public CakeMachine getCakeMachine() { return new CheeseCakeMachine(); } @Override public BeverageMachine getBeverageMachine() { return new CoffeeMachine(); } } public class MachineFactoryB implements MachineFactory{ @Override public CakeMachine getCakeMachine() { return new CreamCakeMachine(); } @Override public BeverageMachine getBeverageMachine() { return new MilkMachine(); } } |
[MainFactory : Client]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class FactoryMain { public static void main(String[] args) { System.out.println( "setA제품은" ); MachineFactory setA = new MachineFactoryA(); setA.getCakeMachine().process(); setA.getBeverageMachine().process(); System.out.println( "setB제품은" ); MachineFactory setB = new MachineFactoryB(); setB.getCakeMachine().process(); setB.getBeverageMachine().process(); } } |
[팩토리메서드패턴과 추상팩토리의 다른점]
-추상팩토리패턴
추상팩토리패턴은 객체를 사용해 제품을 만들고, 객체의 구성을 통해서 객체를 만든다.
추상팩토리패턴은 제품군을 만들기 위한 추상 형식을 제공하고 있다. 제품이 생산되는 방법은 서브 클래스에서 정의된다. 따라서 팩토리 메소드 패턴을 쓸 때와 마찬가지로 클라이언트와 클라이언트에서 사용하는 실제 구상 제품이 분리된다.
-팩토리메서드패턴
팩토리메서드패턴과 클래스를 사용해서 제품을 만들고, 상속을 통해서 객체를 만든다.
팩토리메서드패턴을 사용하는 이유는 서브클래스를 통해 객체를 만들기 위함이고, 클라이언트와 구상클래스를 분리시켜주는 역할을 한다.
출처 위키디피아 팩토리메서드와 추상팩토리의다른점 추상팩토리메서드
출처 : http://meylady.tistory.com/