생성패턴(creational pattern) :: 디자인 패턴

Abstract Factory



Abstract Factory 패턴의 구조는 위 그림과 같다. AbstractFactory라는 추상 클래스가 있고, 그 추상 클래스는 필요한 객체들을 생성하는 인터페이스를 가지고 있다. 실제로 객체를 생성하는 역할을 맞는 클래스(ConcreteFactory)들은 AbstractFactory 추상클래스를 상속하고 객체 생성 인터페이스를 구현한다. AbstractFactory 추상 클래스를 상속하는 ConcreteFactory를 여러 종류 만들 수도 있는데 각 클래스가 하나의 객체 Family를 이루게 된다. Client는 ConcreteFactory가 생성하는 실제 객체들(Product..)들의 부모인 AbstractProduct에 대해서만 알고 있어도 된다.
Abstract Factory 패턴은 ConcreteFactory만 교체하면 전체 Product들이 바뀌는 효과를 낼 수 있다. 흠..내 생각에 이런 것이 필요한 대표적인 경우로는 인터페이스의 스킨기능을 들 수 있을 것 같다. 책에도 이 패턴이 대표적으로 사용되는 경우가 인터페이스의 구성요소를 통째로 갈아끼우는 식의 구현이 필요할 때라고 적혀 있다.

Builder


Builder 패턴의 구조는 위 그림과 같다. Director가 Builder에게 어떤 객체의 생성을 요청하면 Builder가 척척 만들어서 Director에게 제공한다. 객체 생성을 전담하는 클래스가 따로 있다는 점에서 Abstract Factory패턴과 비슷하긴 한데, 약간 다른 점은 주로 Builder패턴은 복잡한 객체를 순서대로(step by step)만드는 반면 Abstract Factory 패턴은 주로 한 종류로 구분할 수 있는(Family) 객체들을 만드는 것에 중점을 두고 있다.

Factory Method


Factory Method패턴은 가장 간단한 생성 패턴이라고 한다. 별거 없이 객체를 직접 new로 생성하지 않고 FactoryMethod를 통해서 생성하는 방법이다. 흠..나름대로 Creator를 여러가지로 상속해서 확장을 꾀할 수 있다.

Prototype



가장 이해하기 힘들었던 패턴이다. 아직도 언제 어떻게 사용해야 할지 잘 모르겠다. C++관점으로 설명하자면. Client는 Prototype 추상 클래스의 포인터를 가지고 있다. Client가 생성될 때 적당한 ConcretePrototype(Prototype추상 클래스를 상속한 구체 클래스)를 생성하여 Client가 가지고 있는 Prototype포인터에 대입해서 유지 한다. Client가 객체를 생성하고 싶을 때 Prototype포인터에 Clone함수를 호출해서 생성한다.
Prototype 패턴의 핵심은 바로 Clone인터페이스 이다!

Singleton
Singleton패턴은 전체 프로세스 상에서 객체가 유일하게 생성되는 클래스를 정의하는 패턴이다. 이 이야기는 More Effective C++에 이미 나왔던 이야기인데, 클래스의 생성자를 public으로 하지 않으면 직접 클래스의 객체를 생성할 수 없게 된다는 점을 이용하면 된다.
클래스의 생성자를 protected나 private으로 하고, 클래스의 객체를 생성하는 인터페이스를 따로 만든다.
간단한 소스로 이해 해보자.

  1. class Singleton {
  2.   public:static void Singleton* Instance();
  3.   protected:static Singleton();
  4.   private:static Singleton* _instance;
  5. };
  6.  
  7. Singleton* Singleton::_instance = 0;
  8.  
  9. Singleton* Singleton::Instance(){
  10.   if(_instance == 0){
  11.     _instance = new Singleton;
  12.   }
  13.   return _instance;
  14. }



2007/06/22 14:44 2007/06/22 14:44
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다