デザインパターンをPlantUMLで確認(作成パターン編)

デザインパターンをPlantUMLで確認します。ここでは、作成パターンとして利用頻度の高いパターンについて取り上げます。( Factory Method Abstract Factory Singleton )

作成コードがばらばらに書かれていると、品質にばらつきが生まれ、保守や機能拡張のコストが高まります。作成コードは1箇所に集約することが望ましく、作成パターンでは、その集約方法のアイデアを与えてくれます。

デザインパターンをPlantUMLで確認(作成パターン編) ← 今回
デザインパターンをPlantUMLで確認(構造パターン編)
デザインパターンをPlantUMLで確認(振舞いパターン編)

Factory Method
( 1つのオブジェクトを生成するための抽象インタフェースを提供 )

@startuml
title Factory

interface Product {
  --
  + productMethod1
  + productMethod2
  + productMethod3
}

class ProductA {
  --
  + productMethod1
  + productMethod2
  + productMethod3
}

class ProductB {
  --
  + productMethod1
  + productMethod2
  + productMethod3
}

abstract class Creator {
  --
  # {abstract} factoryMethod(): Product
  + anOperation()
}

class CreatorA {
  --
  # factoryMethod(): Product
}

class CreatorB {
  --
  # factoryMethod(): Product
}

Creator <|-- CreatorA
Creator <|-- CreatorB
Product <|.. ProductA
Product <|.. ProductB
ProductA <. CreatorA : create
ProductB <. CreatorB : create
Product <. Creator : use


note right of Creator
  // anOperationの処理フローの例
  func anOperation() {
    product = this.factoryMethod()
    product.productMethod1
    product.productMethod2
    product.productMethod3
  }
end note
@enduml
602-desgin-pattern-creationall-with-uml-factory.png

Factory Methodは、Productインタフェース を実装した Productクラス のインスタンスを生成して返します。どの Productクラス をインスタンス化するかはサブクラスで決定します。

Productの利用者は、Productインタフェースのみだけ関知して、具体的にどういったProductが存在するかは関知しません。

なお、factoryMethodをpublicにして外部クラスから実行するケースもあります。

Abstract Factory
( 関連する一連のオブジェクトを生成するための抽象インタフェースを提供 )

@startuml
title Abstract Factory

class Client

package AbstractFactory {
  interface AbstractFactory {
    --
    + createProductA(): ProductA
    + createProductB(): ProductB
  }

  class FactoryA {
    --
    + createProductA(): ProductA
    + createProductB(): ProductB
  }

  class FactoryB {
    --
    + createProductA(): ProductA
    + createProductB(): ProductB
  }
}

package Product {
  interface ProductA
  class ProductA1
  class ProductA2

  interface ProductB
  class ProductB1
  class ProductB2
}

Client ..> AbstractFactory : use
Client ..> ProductA : use
Client ..> ProductB : use

AbstractFactory <|.. FactoryA
AbstractFactory <|.. FactoryB
ProductA <|.. ProductA1
ProductA <|.. ProductA2
ProductB <|.. ProductB1
ProductB <|.. ProductB2
ProductA1 <.. FactoryA : create
ProductB1 <.. FactoryA : create
ProductA2 <.. FactoryB : create
ProductB2 <.. FactoryB : create
@enduml
602-desgin-pattern-creationall-with-uml-abstract-factory.png

Abstract Factoryパターンでは、関連する一連のオブジェクトを生成するための抽象インタフェースを提供します。

Singleton
( インスタンスが1つだけであることを保証 )

@startuml
title Singleton

class Singleton {
  - {static} instance : Singleton
  --
  - Singleton()
  + {static} getInstance() : Singleton
}
@enduml
602-desgin-pattern-creationall-with-uml-singleton.png

Singletonパターンは生成されるインスタンスを1つに制限します。アプリ全体で1つのインスタンスを使い回したいときに利用します。

わくわくBank.
フリーランスのエンジニアとして活動してます。ここでは、ソフトウェア開発で必要とされる技術、用語、概念を整理しています。