简单工厂模式是将业务逻辑包含在一个类中,使用的时候直接调用接口,传一个参数进去,然后获得对应的对象,但是当要创建的产品对象的种类发生改变(增加或者减少),都要通过修改工厂类,这就不符合开闭原则(对修改关闭,对扩展开放)了。
工厂模式与简单工厂模式的去别就在于,如果要创建的产品对象的种类发生改变,我们只需要定义一个该类对象的一个工厂,用来专门生产这种对象。如果有疑问,可以看一下这篇博文:简单工厂模式
比如,有水果这个基类,这个基类有苹果和香蕉,那么用简单工厂模式,可以用下面的代码实现
<?php abstract class Fruit{ abstract public function say(); } class Apple extends Fruit{ public function say(){ echo "I'm Apple "; } } class Banana extends Fruit{ public function say(){ echo "I'm banana "; } } class Factory{ public function getFruit($fruit){ if($fruit=="Apple"){ return new Apple; } else if($fruit == "Banana"){ return new Banana; } else { return NULL; } } } //创建一个工厂 $factory=new Factory(); $fruit=$factory->getFruit("Apple"); $fruit->say();//I'm Apple $fruit=$factory->getFruit("Banana"); $fruit->say();//I'm banana ?>
那么现在又有一个水果梨,要获得梨对象,如果用简单工厂模式,如上面的代码,那就得现定义一个梨的类,然后修改factory工厂类,加一个判断条件,如果$fruit==pear,则返回一个梨对象。
现在用工厂模式,只需要定义一个梨的类,然后再定义一个抽象工厂类,然后再定义一个生产梨的工厂类,直接用生产梨工厂去生产梨,以后每增加一种水果,只需要重复做这些工作即可,不用对工厂类进行修改。比如下面的代码
<?php //创建水果基类 abstract class Fruit{ abstract public function say(); } //创建一个苹果类 class Apple extends Fruit{ public function say(){ echo "I'm Apple "; } } //创建一个香蕉类 class Banana extends Fruit{ public function say(){ echo "I'm banana "; } } //新增了一个梨类 class Pear extends Fruit{ public function say(){ echo "I'm pear "; } } //创建一个抽象工厂来 abstract class Factory{ abstract public function getFruit(); } //创建苹果工厂类 class AppleFactory extends Factory{ public function getFruit(){ return new Apple; } } //创建香蕉工厂类 class BananaFactory extends Factory{ public function getFruit(){ return new Banana; } } //新建一个梨工厂类 class PearFactory extends Factory{ public function getFruit(){ return new Pear; } } $factory=new AppleFactory(); $fruit=$factory->getFruit(); $fruit->say();//I'm Apple $factory=new BananaFactory(); $fruit=$factory->getFruit(); $fruit->say();//I'm banana $factory=new PearFactory(); $fruit=$factory->getFruit(); $fruit->say();//I'm pear ?>