工事中なのだ。
自分の言葉で表現できないデザパタは自分の血肉になっていないのだ。
とあるエンジニア社長さんに「デザパタわかってるなら、『プログラマ』と名乗って良いよ」って教えて貰ったことがあった。私は少しずつプログラマの階段を登れてきてるかなぁ🐰☁️
— 優さん🌷個人開発 (@yuu13n6) November 1, 2019
もくじ
Singleton
インスタンスが1つだけ存在することを保証するパターン。2つ作らせない。
- static $singleton = nullプロパティ
- public static getInstance()
- __clone()の禁止
が特徴
設定、状態の1つを表す静的なクラスインスタンスに使える。
Template Method
抽象クラスを利用したポリモーフィズム。
Strategy
Interfaceで共通処理を定義して、異なる処理を行うクラスを作成する。
ifやSwitchで分岐させるのではなく、依存を利用して呼び出すクラスを変更していく。
Mediator
調停者。Collegueの中にMeditatorを持つのが特徴。
複数の飛行機と管制塔。
飛行機の中に管制塔を持たせる。管制塔のセッターで飛行機を入れる時に、飛行機に管制塔自身をプロパティに持たせる。
これで飛行機が管制塔の情報を正しく持つことができる。
Adapter
extends, implementsの両方利用することで、元のクラスをいじらないで拡張したクラス。
- 石油自動車クラス
- 電気自動車クラス
→Adapterで電気自動者クラス
Chain Of Responsibility
バリデーションで利用できる。
デフォルトのバリデーション、もう1つ追加するバリデーション。
バリデーションの種類を責任クラスとしてそれぞれ登録してContextに配列で保持しておく。
ループでバリデーションを複数実行していく。
Iterator
データベースのカラム追加などで、出力しなければいけないキーが増えたとする。
クラスに含まれる配列のプロパティを参照側で出力した時に、参照側でforeachでハードコーディングしていると、参照しているファイルが複数あった時に複数対応しなければいけなくなる。
→Iteratorの中でdumpしてその結果を参照側に渡すようにする。そうすればIteratorを操作するだけで参照側ファイルをいじらなくて済む。
Observer
メイン処理と共通のサブクラス処理群を分離させて実行させる。
Observerのコンクリートクラス複数を配列プロパティにInterfaceのSubjectクラスに登録しておく。Subjectクラスのアクションを実行する毎に、ObserverクラスがInterface Subjectクラス内のnotify()でforeachで実行されていく。
Command
Queueクラスが特徴。
- QueueクラスをInvokerクラスとして持ち、Interface Commandを定義して複数のConcrete Commandを生成する。
- QueueクラスにCommandインスタンスを$commandsプロパティで複数保持して、run()させる。
- $commandsプロパティにはいくつもCommandクラスを持たせることができるので柔軟に実行できる。
Moment
MomentとなるSnapshotクラスを持つのが特徴。
Snapshotクラスにtakesnapshot()やrestoresnapshot()で元に戻すことができる。
State
ContextクラスにConcrete Stateクラスを保持する。
- Concrete StateクラスはSingletonパターンで実装すること
同じConcrete Stateクラスのインスタンスは静的な状態なので複数存在する必要がない。 - Concrete Stateクラスはnext()で次に切り替えるConcrete Stateクラスをハードコーディングで持つこと
Flyweight
生成するインスタンスが静的なものの場合に取り回して利用する為のパターン。
- Flyweight FactoryクラスはSingletonで作成
- Flyweight FactoryでFlyweightクラスをaddFlyweight()する時に、同じ内容のFlyweightクラスインスタンスがないかチェックしてから、addする
Facade
たくさんのクラス部品で処理を構成している場合に、『窓口』 『正面玄関』 をFacadeクラスとして用意することでリモコンのようなことができる。
- 車のディーラー = Facadeクラス
- お客様 = Client
とする。
- 客はディーラーを通して、エンジン、タイヤといったパーツを選んでいく。
- 客はディーラーに注文合計を計算して貰う
- 客はディーラーに発注をお願いする