Abstract Factoryパターン:クラスを抽象化するデザインパターンをクラス図にまとめる

デザインパターン

Abstract Factoryパターン

Abstract Factoryパターンは、具体的な実装を抽象化したインターフェースを作成するデザインパターンです。
自分なりにAbstract Factoryパターンをクラス図にまとめてみました。

Abstract Factoryパターンのクラス図

Abstract Factoryパターンのクラス図

Abstract Factoryパターンのクラス図

Abstract Factoryパターンの解説

複数のクラス群を使用したシステムの場合に、各クラスの内部の処理を別の処理に変更して実行したい場合(例えば、モック用のクラスと実際の処理を実装したクラスのように)、各クラスの親クラスを作成し(図ではProductA,B)、そのクラスを継承するProductA1,A2およびProductB1,B2を作成する。
このクラスをそのままClientが使用すると、ProductA1からA2に切り替える際に、Client側の記述を変更しなければいけなくなる。
そこで、ProductA1,B1を生成するFactory1クラス、ProductA2,B2を生成するFactory2クラスを作成し、
その生成処理を抽象メソッドcreateProductA,createProductBをもつインターフェースFactoryを用意する。
こうすることで、Client側はFactoryオブジェクトを生成しcreateProductA,createProductBを実行すれば、
FactoryオブジェクトがFactory1か2かに応じて、ProductA1かA2、B1かB2のどちらかが生成されるようになる。

Abstract Factoryパターンをどういう場合に使うか

複数の条件によって、使用するクラスの実装が変わる場合に使用できる。
例えば商品の種類によって値引き計算や特典が異なる場合や、社員の分類によって給与計算が異なるなど。
また、上記のようにモック用の処理と本番用の処理を切り替えるような場合にも使える。

PlantUMLでAbstract Factoryパターンのクラス図を記述する

Abstract Factoryパターンのクラス図をPlantUMLで書いたときのソースです。

@startuml Abstract Factory
class ProductA{}
class ProductA1 extends ProductA{}
class ProductA2 extends ProductA{}

class ProductB{}
class ProductB1 extends ProductB{}
class ProductB2 extends ProductB{}

interface Factory{
  + {abstract} createProductA(): ProductA
  + {abstract} createProductB(): ProductB
}
class Factory1 implements Factory{
  + createProductA(): ProductA1
  + createProductB(): ProductB1
}
class Factory2 implements Factory{
  + createProductA(): ProductA2
  + createProductB(): ProductB2
}

Class Client{}

Client ..> Factory : use >
Client ..> ProductA : use >
Client ..> ProductB : use >
Factory1 ..> ProductA1 : create >
Factory1 ..> ProductB1 : create >
Factory2 ..> ProductA2 : create >
Factory2 ..> ProductB2 : create >
@enduml

参考サイトURL

デザインパターン入門(Abstract Factory)- Qiita
Factory MethodパターンとAbstract Factoryパターン