こちらのサイトではDRUPAL10に関連する記事を掲載しています。
この記事はこちらのサイトを引用させていただきました
Page Not Found - わくわくBank
デザインパターンをPlantUMLで確認します。ここでは、作成パターンとして利用頻度の高いパターンについて取り上げます。
作成コードがばらばらに書かれていると、品質にばらつきが生まれ、保守や機能拡張のコストが高まります。作成コードは1箇所に集約することが望ましく、作成パターンでは、その集約方法のアイデアを与えてくれます。
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
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
Singleton
( インスタンスが1つだけであることを保証 )
@startuml
title Singleton
class Singleton {
- {static} instance : Singleton
--
- Singleton()
+ {static} getInstance() : Singleton
}
@enduml
Singletonパターンは生成されるインスタンスを1つに制限します。アプリ全体で1つのインスタンスを使い回したいときに利用します
この記事またはDrupalに関するご質問がございましたら、お気軽にお問い合わせください。