工厂模式
Posted 寻觅beyond
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。
简单工厂模式是将业务逻辑包含在一个类中,使用的时候直接调用接口,传一个参数进去,然后获得对应的对象,但是当要创建的产品对象的种类发生改变(增加或者减少),都要通过修改工厂类,这就不符合开闭原则(对修改关闭,对扩展开放)了。
工厂模式与简单工厂模式的去别就在于,如果要创建的产品对象的种类发生改变,我们只需要定义一个该类对象的一个工厂,用来专门生产这种对象。如果有疑问,可以看一下这篇博文:简单工厂模式
比如,有水果这个基类,这个基类有苹果和香蕉,那么用简单工厂模式,可以用下面的代码实现
<?php abstract class Fruit{ abstract public function say(); } class Apple extends Fruit{ public function say(){ echo "I\'m Apple\\n"; } } class Banana extends Fruit{ public function say(){ echo "I\'m banana\\n"; } } 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\\n"; } } //创建一个香蕉类 class Banana extends Fruit{ public function say(){ echo "I\'m banana\\n"; } } //新增了一个梨类 class Pear extends Fruit{ public function say(){ echo "I\'m pear\\n"; } } //创建一个抽象工厂来 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 ?>
以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )