Search Results for '디자인 패턴/1. 추상 팩토리( Abstract Factory )'

1 POSTS

  1. 2012.10.22 추상 팩토리 패턴

추상 팩토리 패턴

Posted 2012. 10. 22. 16:06

추상 팩토리 패턴이란?

통된 부분은 객체들의 동적 메모리 할당을 책임지고 관리하는 팩토리를 만들어서 확장 및 관리를 용이 하게 할 수 있는 패턴.

인터페이스를 이용해 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성가능.

추상 팩토리를 통해 객체의 집합을 생성하기 위한 인터페이스만 제공.

인터페이스를 이용하는 코드를 만들면 제품을 생산하는 실제 팩토리와 분리됨.

서로 다른 상황별로 적당한 제품을 생산 할 수 있는 다양한 팩토리를 구현 할 수 있게 된다.


말 그대로 추상적이다.. 기능을 만드는 틀만 제공. 기능은 자식클래스가 구현

추상 객체내의 가상함수를 통해 다형성을 추구하지.


사용부분은..

1. 여러 객체중에서 특정 객체를 선택하여 생성하고자 할때

2. 관련된 객체들이 함께 사용되도록 설계되어서 이 부분에 대한 규약이 외부에서 사용할때도

지켜지게 하고 싶을때.

3. 객체가 생성되거나 구성, 표현 되는 방식과 무관하게 시스템을 독립적으로 만들고자 할때

4. 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체 할 수있을때.

5. 제품에 대한 클래스 라이브러리를 제공하고 ,그들의 구현이 아닌 인터페이스를 노출시키고 싶을때.


장점.

1. 응용 프로그램이 생성 할 각 객체의 클래스를 제어 할 수 있다.

팩토리는 제품 객체를 생성하는 과정과 책임을 캡슐화한 것이기 때문에, 구체적인 구현 클래스가 사용자에게서 분리된다. 

2. 제품군을 쉽게 대체 할 수 있다, 필요한 모든 것을 생성하기 때문에 전체 제품은 한번에 변경이 가능하다.

3. 그래서 제품 사이에 일관성이 좋다.


단점.

새로운 종류의 제품을 만들기 위해 기존 추상 팩토리를 확장하기가 어렵다.

생서되는 제품은 추상 팩토리가 생성 할 수 있는 제품 집합에만 고정되어 있기 때문..

새로운 제품이 등장하면 팩토리의 구현을 변경해야 한다.

그러면 상속받는 서브클래스들은 모두 변경 되야 한다..



#include <iostream>

using namespace std;


class Unit

{

public:

virtual void Attack() = 0;        << 순수 가상 함수, 상속받게 될 놈들은 자신만의 attack를 표현

virtual ~Unit(){}

};


class Marin : public Unit

{

public:

void Attack()    // 부모의 순수가상함수를 자기만의 표현을 한다.

{

cout << "마린:탕탕" << endl;

}

};


class Battle : public Unit

{

public:

void Attack()

{

cout << "배틀 : 뿅뽕" << endl;

}

};


class Factory

{

public:

virtual Unit *NewUnit() = 0;

virtual ~Factory(){}

};


class Barrack : public Factory

{

public:

Unit *NewUnit()

{

return new Marin();

}

};


class Starport : public Factory

{

public:

Unit *NewUnit()

{

return new Battle();

}

};


void Main()

{

Factory *fac;

Unit *unit;


fac = new Barrack();

unit = fac->NewUnit();

unit->Attack();


delete fac;

delete unit;


fac = new Starport();

unit = fac->NewUnit();

unit->Attack();

delete fac;

delete unit;

}


-> 마린 : 탕탕

-> 배틀 : 뿅뿅