今回はデザインパターンの一種であるSimple Factoryパターンに関して。
Simple Factoryパターンとは
正確な定義は色々と難しいと思いますが、わかりやすく言うと、
サブクラスなどがある場合、インスタンス化する部分を別オブジェクトに任せ、カプセル化するデザインパターン
だと認識しています。この任せられる別オブジェクトの部分をSimpleFactoryなどと言います。
サンプルコード
抽象的な例だと難しいので、コードを見てみます。
Pet.php
1 2 3 4 5 6 7 8 |
<?php interface Pet { public function bark(); public function getName(); } |
Dog.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php class Dog implements Pet { private $name; public function __construct($name) { $this->name = $name; } public function getName() { echo "dog name is " . $this->name . "\n"; } public function bark() { echo 'wanwan' . "\n"; } } |
Cat.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class Cat implements Pet { private $name; public function __construct($name) { $this->name = $name; } public function getName() { echo "cat name is " . $this->name . "\n"; } public function bark() { echo 'nyanya' . "\n"; } } |
AnimalFactory.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php class AnimalFactory { public function createAnimal( $type, $name) { $animal = null; switch ($type) { case 'cat': $animal = new Cat($name); break; case 'dog': $animal = new Dog($name); break; } return $animal; } } |
AnimalController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php require_once 'Pet.php'; require_once 'Dog.php'; require_once 'Cat.php'; require_once 'AnimalFactory.php'; $animalController = new AnimalControll(new AnimalFactory()); $animalController->set_animal('dog', 'pocchi'); //dog name is pocchi //wanwan $animalController->set_animal('cat', 'tama'); //cat name is tama //nyanya class AnimalController { private $factory; public function __construct($factory) { $this->factory = $factory; } public function set_animal($type, $name) { $animal = $this->factory->createAnimal($type, $name); $animal->getName(); $animal->bark(); } } |
https://github.com/umanari145/phptips/tree/master/factory
解説
AnimalFactoryの中でCatやDogのインスタンスが生成され、AnimalControllerからはインスタンス生成が見えないため、疎結合になります。
このため、AnimalControllerがサブクラスの変更(CatがDogに変更されるなど、)の影響を受けないと言うメリットがあります。
SimpleFactoryメソッドを使わない場合、AnimalControllerの部分にDogやCatのインスタンス生成を書かないといけないため、変更の影響を受けてしまいます。
参考リンク