U E D R , A S I H C RSS

Gof/Abstract Factory

No older revisions available

No older revisions available




1. Abstract Factory

1.1. Intent

구체적인 클래스를 정의하지 않고서, 연관되거나 의존적인 객체집합을 만들수 있는 인터페이스를 제공한다.

1.2. Also Known As

Kit

1.3. Motivation

유저인터페이스 툴킷은 다양한 앤필 기준을 제공하도록 고려한다. 다른 룩앤필은 스크롤바, 윈도우, 그리고 버튼처럼 다른 모습과 행동양식의 유저 인터페이스 Widget을 제공한다. 이식가능한 룩앤필 기준을 위해서는, 개별적 룩앤필 Widget을 위한 어떤 애플리케이션은 드-코드 가 아니어야 한다. 즉석으로 정의한 룩앤필 클래스는 나중에 룩앤필을 바꾸기 어렵게 만든다.

이 문제는 기본적인 Widget의 인터페이스를 정의한 abstract WidgetFactory 클래스를 정의함으로써 해결할 수 있다. 또한 모든 종류의 Widget에는 추상클래스가 존재한다, 그리고 구체적인 서브 클래스는 Widget을 상속해서 룩앤필 기본을 정의한다. WidgetFactory의 인터페이스는 각각의 추상 Widget 클래스의 새로운 객체를 반환하는 기능을 가지고 있다. 클라이언트는 이런 기능을 수행해서 Widget 인스턴스를 만든다. 그러나 클라이언트는 사용하는 클래스의 구체적인 내용에 대해서는 신경쓰지 않는다. 이처럼 클라이언트는 일반적인(?) 룩앤필의 독립성에 의존한다.


각각의 룩앤필에는 해당하는 WidgetFactory의 서브클래스가 있다. 각각의 서브클래스는 해당 룩앤필의 고유한 widget을 생성할 수 있는 기능이 있다. 예를 들면, MotifWidgetFactoryCreateScrollBar는 Motif 스크롤바 인스턴스를 생성하고 반환한다, 이 수행이 일어날 동안 PMWidgetFactory 상에서 Presentation Manager 를 위한 스크롤바를 반환한다. 클라이언트는 WidgetFactory 인터페이스를 통해 개개의 룩앤필에 해당한는 클래스에 대한 정보 없이 혼자서 widget들을 생성하게 된다. 달리 말하자면, 클라이언트는 개개의 구체적인 클래스가 아닌 추상클래스에 의해 정의된 인터페이스에 일임하기만 하면 된다는 뜻이다.

또한 WidgetFactory는 widget 클래스 간의 의존관계를 형성한다. Motif 스크롤바는 Motif 버튼과 Motif 텍스트 에디터와 함께 사용되어야 한다, 그리고 MotifWidgetFactory를 사용함으로써 이러한 의존성이 강제적으로 이루어지게 된다.

1.4. Applicability

이럴 때 Abstract Factory 패턴을 사용해라
  • 시스템이 부산물을 만들고, 작성하고, 그리고 보여지는 것과 독립적이어야 할 때.
  • 시스템이 다양한 부산물의 집합을 고려해야 할 때.
  • 어떤 연관된 집합의 객체들이 서로 같이 사용될 수 있도록 디자인되어지게 강제해야 할 때.
  • 클래스 라이브러리를 나누고 싶고, 인터페이스만을 드러내되, 클래스의 동작을 보이지 않고자 할 때.

1.6. Participants

  • AbstractFactory(WidgetFactory)
    • 추상 객체(ProductObject)들을 만드는 기능을 위한 인터페이스를 정의한다.
  • ConcreteFactory(MotifWidgetFactory, PMWidgetFactory)
    • 객체(ProductObject)를 만드는 기능을 수행한다.
  • AbstractProduct(Window, ScrollBar)
    • 어떤 객체(ProductObject)를 위한 인터페이스를 정의한다.
  • ConcreteProduct(MotifWindow, MotifScrollBar)
    • 팩토리에 상응하는 객체(ProductObject)를 정의한다.
    • 추상 인터페이스(ProductInterface)를 수행한다.
  • Client
    • AbstractFactory에 의해서 정의된 인터페이스와 AbstractProduct 클래스만을 사용한다.

1.7. Collaborations

  • 보통의 경우 ConcreteFactory 클래스의 단일 인스턴스는 수행시간(run-time)중에 생성된다.
    이 concrete factory는 특정 상속에 의한 객체(ProductObject)를 만들어낸다. 서로 다른 객체(ProductObject)를 만들어 내기 위해서는
    클라이언트는 서로 다른 concrete factory를 사용해야 한다.
  • AbstractFactory는 객체(ProductObject)의 생성을 ConcreteFactory의 서브 클래스에 위임한다.

1.8. Consequences

Abstract Factory 패턴은 다음과 같은 장점과 단점이 있다.
  1. 독립적인 concrete 클래스들. Abstract Factory 패턴은 어플리케이션이 생성한 오브젝트의 클래스를 조정할 수 있도록 해준다.
    factory가 객체를 만들어 내는데 대한 수행과 책임을 캡슐화 하기 때문에 상속한 클래스로부터 클라이언트가 독립적일 수 있다.
    클라이언트는 추상 인터페이스를 통해서 인스턴스를 다룬다. concrete facoty의 수행에서 산물의 클래스 이름은 차단되어있다.
    즉 클라이언트 코드에 concrete factory가 나타나지 않는다.
  2. 산물의 집합간에 전환을 쉽게 해준다. concrete factory의 클래스는 어플리케이션에 단 한번, 선언될 때만 쓰인다.
    이는 conncrete factory를 쉽게 전환해서 사용할 수 있도록 해주고. 이로써 간단하게 concrete factory만 바꿔줌으로서 서로다른 산물의 조건을 쉽게 쓸수 있다.
    abstract factory는 완벽한 산물의 집합을 생성해 내게되어, 모든 산물의 집합이 한번에 바뀔 수 있게 한다(같은형태의 다른 모습들이므로.. 역자 주).
    UI 예제에서 Motif widgets을 Presentation Manager widgets로 바꾸는 작업을 단지 유사한 팩토리의 객체와 바꿔주고 그 인터페이스를 다시 생성함으로써 행할 수 있다.
  3. 산물간의 일관성을 촉진한다. 어떤 집합내의 객체들이 서로 협력하도록 고안되었다면, 어떤 어플리케이션은 한번에 단 하나의 집합에서 객체를 사용하는 것이 중요하다.
    AbstractFactory는 이것을 쉽게 한다.
  4. 새로운 산물을 지원하는 것이 어렵다. abstract factory들을 확장해서 새로운 산물을 생성하는 것은 쉽지 않다.
    왜냐하면 AbstractFactory 인터페이스는 생산되어질 산물의 집합을 고정해놓기 때문이다. 새로운 산물을 지원하는 데는 factory의 인터페이스를 확장할 필요가 있다
    (AbstractFactory 클래스와 모든 서브 클래스들을 바꾸는것을 포함해서). Implementation 부분에서 이것에 대한 한가지 해결점에 대해 논의 할 것이다.

1.9. Implementation

1.10. Sample Code

1.11. Known Uses

InterViewsAbstractFactory 클래스들을 나타내기 위해서 'Kit'를 접미사로 사용한다. 이것은 WidgetKitDialogKit abstract factory 들을 명확한 앤필 UI 객체를 위해서 정의한다. InterViews는 또한 서로 다른 복합 객체를 생성하는 LayoutKit 을 포함다. 예를 들면, 어떤 layout은 문서의 방향(인물이나 풍경)에 따른 서로 다른 복합 객체를 개념적으로 정렬한다.

ET++WGM88은 다른 윈도우 시스템(예를 들면, X Windows 와 SunViews)간의 호환을 수행하기 위해서 Abstract Factory 패턴을 사용했다. 윈도우 시스템의 추상 base 클래스는 윈도우시스템의 자원 객체(예를 들면, MakeWindow, MakeFont, MakeColor)를 생성할 수 있는 인터페이스를 정의한다. Concrete 서브 클래스는 특정 윈도우 시스템에 인터페이스를 수행한다.

1.12. Related Patterns

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:18
Processing time 0.0961 sec