この前、domicoのライブが宮崎であるというレアな事象ありました。
行かないわけにはいかないので、行ってきました。
めっちゃ、カッコ良いかったです。
早速ですが、私「増補改訂版Java言語で学ぶデザインパターン入門」
を読んでますが、並行して楽しく読めると噂のこれも読んでいます。
そこに、Factoryパターン一族
– Simple Factory
– Factory Method
– Abstract Factory
の章があったので、
ぜひアウトプットしたく書きます!
今回はSimpleFactoryについてです!
Simple Factory
正確にはFactoryパターンではない!ですが便利なやつです。
サブクラスが複数存在する場合、
if文などで、各サブクラスをインスタンス化する
→ アプリケーション部分の各部分にif文が分散してしまったり、
保守と更新が困難になったり、実装の間違いが多くなるという問題があります。
したがって、
アプリケーション内で、
インスタンス化する部分(変化する部分)と変化しない部分
を分けてカプセル化する
というのがSimpleFactoryです。
こんなな感じかと思います。
上記でいうと、SimplePizzaFactory = SimpleFactoryになります。
▶︎PizzaStore
SimplePizzaFactoryのクライアント。
ピザをインスタンス取得しますが、
「ギリシャピザやクラムピザなどの具象ピザ」については知る必要がありません。
「pizzaインターフェースを実装したピザ(具象ピザ)を取得し、
prepareメソッド,bakeメソッド,…を呼び出せる」ことを知ってるだけで良い。
ピザを取得する事に関しては、SimplePizzaFactoryに任せるだけでOK!
▶︎SimplePizzaFactory
SimpleFactoryの主役。
ピザをの作成方法だけを扱うクラス。
具象Pizzaクラスを参照する唯一の部分。
▶︎Pizza
SimplePizzaFactoryの製品であるPizzaの抽象クラス。
具象ピザはこれを実装する。
└ VeggiePizza 具象ピザ(具象製品)
└ PepperoniPizza 具象ピザ(具象製品)
└ ClamPizza 具象ピザ(具象製品)
└ CheesePizza 具象ピザ(具象製品)
新作ピザの追加、ピザメニューの削除があっても。。。
大丈夫!
SimplePizzaFactory.php
- use HFD\SimpleFactory\Pizza\PepperoniPizza; use HFD\SimpleFactory\Pizza\ClamPizza; use HFD\SimpleFactory\Pizza\VeggiePizza; + use HFD\SimpleFactory\Pizza\GreekPizza; function createPizza(string $type): object { $pizza = null; if ($type == "チーズ") { $pizza = new CheesePizza(); - } else if ($type == "ペパロニ") { - $pizza = new PepperoniPizza(); } else if ($type == "クラム") { $pizza = new ClamPizza(); } else if ($type == "野菜") { $pizza = new VeggiePizza(); + } else if($type == "ギリシャ"){ + $pizza = new GreekPizza(); }
GeekPizza.php(新作ピザ)
+namespace HFD\SimpleFactory\Pizza; + + +class GreekPizza extends Pizza { + + public function __construct() { + $this->name = "ギリシャピザ"; + } + +}
ピザの作成を
SimplePizzaFactoryに任せてるので、
SimplePizzaFactoryの修正と
新作ピザクラス(具象ピザ)の追加のみで対応できる。
さらに、PizzaStoreと分けているので
PizzaStoreには影響が少ない!
なによりシンプルでわかりやすいですね。
次は、FactoryMethodについて書きたいと思います!