ファクトリー メソッド パターンは、ジェネレーティブ デザイン パターンを指します。
このパターンは、特定のクラスのオブジェクトを作成するためのインターフェイスの作成を記述します。簡単そうに思えますよね?
理論上
AR メガネを操作するためのフレームワークを開発しているとします。頭を横に傾けると、利用可能なアプリケーションのメニューがユーザーの目の前に表示されるはずです。アプリケーションは、当社のフレームワークのクライアントであるサードパーティ企業によって開発されます。当然のことながら、どのアプリケーション、アイコン、名前が表示されるべきかわからないため、アイコンとアプリケーションに関する関連情報を実装するためのインターフェイスを提供する必要があります。これを製品:
と呼びましょう。
protocol Product {
var name: String { get }
var image: Image { get }
var executablePath: String { get }
}
次に、クライアントが特定の製品用の一連のアプリケーションの発行を実装できるように、インターフェイスを提供する必要があります。名前が付いたアプリケーション アイコンの配列。これはフレームワーク内ですでに描画されています。
このインターフェースを書いてみましょう – プロダクトの配列を返すファクトリ メソッドを含むクリエイターインターフェース。
protocol Creator {
func factoryMethod() -> [Product]
}
実際に
AR フレームワークの最初のクライアントは 7B – 社でした。 ホンジュラスのコーヒーメーカー用ソフトウェアの大手サプライヤー。彼らは、屋内マップ モードを使用して、コーヒーを淹れたり、水や豆が入っているかどうかを確認したり、最寄りのコーヒー メーカーへの道を示す機能を備えた拡張現実グラスを販売したいと考えています。
彼らはソフトウェアの開発を引き受けます。私たちは、アプリケーションのリストとその詳細を正しく表示するために、クリエイター インターフェイスと 製品 インターフェイスに関するドキュメントを提供することのみを求められます。
ドキュメントを転送した後、7B 社は Creator インターフェースを使用して Specific Creator を実装します。アプリケーションアイコンの配列を返すクラス。アイコン アプリケーション自体は、製品 インターフェースを実装する特定の製品 クラスです。
特定の製品のコード例:
class CoffeeMachineLocator: implements Product {
let name = “7B Coffee Machine Locator v.3000”
let image = Image.atPath(“images/locator.tga”)
let executablePath = “CoffeeMachineLocator.wasm”
}
class iPuchinno: implements Product {
let name = “iPuchinno 1.0.3”
let image = Image.atPath(“images/puchino.pvrtc”)
let executablePath = “neutron/ipuchBugFixFinalNoFreezeFixAlpha4.js”
}
クラス Concrete Creator は、2 つのアプリケーションの配列を提供します。
class 7BAppsCreator: implements Creator {
func factoryMethod() -> [Product] {
return [CoffeeMachineLocator(), iPuchinno()]
}
}
この後、7B 社はコンクリート製品、コンクリート クリエーターのライブラリを編集し、それを当社のフレームワークと組み合わせて、コーヒー メーカー用の AR グラスの販売を開始します。 私たちの側での追加は必要ありません。
ソース
https://refactoring.guru/ru/design-patterns/command
https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612
