블링블링 범블링

추상팩토리패턴(Abstract Factory Pattern) 본문

Technology/객체 지향 디자인 패턴

추상팩토리패턴(Abstract Factory Pattern)

뻠스키 2018. 4. 18. 11:34

추상팩토리패턴(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();
         
    }
 
}

메인을 통해서 setA에는 치크케익과 음료를 선택, 그리고 setB에는 생크림케익과 우유를 생산할 수 있다는 것을 볼 수 있다. 이렇게 다양한 구성에서 원하는 것을 선택해 하나의 군을 형성하는 것을 볼 수 있다. 이렇게 추상팩토리패턴은 클라이언트에서 서로 연관된 인련의 제품들을 만들어야할 때, 다시말해서 제품군을 만들어야할 할 때 사용된다.

[팩토리메서드패턴과 추상팩토리의 다른점]

-추상팩토리패턴

추상팩토리패턴은 객체를 사용해 제품을 만들고, 객체의 구성을 통해서 객체를 만든다. 

추상팩토리패턴은 제품군을 만들기 위한 추상 형식을 제공하고 있다. 제품이 생산되는 방법은 서브 클래스에서 정의된다. 따라서 팩토리 메소드 패턴을 쓸 때와 마찬가지로 클라이언트와 클라이언트에서 사용하는 실제 구상 제품이 분리된다.


-팩토리메서드패턴

팩토리메서드패턴과 클래스를 사용해서 제품을 만들고, 상속을 통해서 객체를 만든다. 

팩토리메서드패턴을 사용하는 이유는 서브클래스를 통해 객체를 만들기 위함이고, 클라이언트와 구상클래스를 분리시켜주는 역할을 한다.


출처 위키디피아   팩토리메서드와 추상팩토리의다른점   추상팩토리메서드

출처 : http://meylady.tistory.com/

Comments