Abstract Factory
- 関連したオブジェクト(部品)のセットを、具体的なクラスを指定することなく生成するためのインターフェース(API)を提供するパターン
- 部品の具体的な実装には注目せず、抽象のAPIに注目し、そのAPIだけを使って、部品のセットを組み立てていく
- 「ポリモーフィズム」を利用したパターン
- 「工場」「部品」ともに抽象と具体のセットになっていて、利用者は抽象のAPIのみを使用する
- どの
ConcreteFactoryを使うかを切り替えるだけで、生成される部品群を切り替えることができる
メリット・デメリット
メリット
- 具体的なクラスをクライアントから隠蔽する
- 利用する部品群の整合性を保つことができる
デメリット
- 必要なクラス数が多く、コードが必要以上に複雑になる可能性がある
用途
- 関連する部品群を決められた種別ごとに整合性を保って切り替えたい場合
- 例) OSのGUI
- mac,linux,windowsで表示されるブラウザのalertなどで表示されるボタンが異なる
- 例) OSのGUI
デザインパターンの種類
生成に関するデザインパターン
例(Mermaid)
AbstractFactory- インターフェースもしくは抽象クラス
- 抽象的な部品である
AbstrctProductを生成するためのAPIを定義する
AbstractProduct- インターフェースもしくは抽象クラス
- 部品ごとのAPIを定義する
ConcreteFactoryAbstractFactoryを継承(実装)する子クラス- 具体的な部品である
ConcreteProductを返すように実装を行う
ConcreteProductAbstractProductを継承(実装)する子クラスConcreteFactoryから返される具体的な部品
classDiagram namespace Concrete { class ConcreteFactory { createProduct1() createProduct2() createProduct3() } class ConcreteProduct3 { performOne() performTwo() } class ConcreteProduct2 { doAlpha() doBeta() } class ConcreteProduct1 { executeA() executeB() } } namespace Abstract { class AbstractFactory { <<interface>> createProduct1() createProduct2() createProduct3() } class AbstractProduct3 { <<interface>> performOne() performTwo() } class AbstractProduct2 { <<interface>> doAlpha() doBeta() } class AbstractProduct1 { <<interface>> executeA() executeB() } } AbstractFactory --> AbstractProduct1 : Creates AbstractFactory --> AbstractProduct2 : Creates AbstractFactory --> AbstractProduct3 : Creates ConcreteFactory --> ConcreteProduct1 ConcreteFactory --> ConcreteProduct2 ConcreteFactory --> ConcreteProduct3 ConcreteProduct3 ..> AbstractProduct3 ConcreteProduct2 ..> AbstractProduct2 ConcreteProduct1 ..> AbstractProduct1 ConcreteFactory ..> AbstractFactory