PHP设计模式—工厂模式之简单工厂模式
程序员文章站
2022-06-19 10:22:25
定义: 简单工厂模式:将调用者和创建者分离,实现解耦,调用者直接向工厂请求,通过工厂去选择需要实例化的对象,用一个单独的类来做这个创建实例的过程。 代码实例: 问题:假设一个关于个人事务管理的项目中有许多类型的对象,其中一个是 Appointment 对象,现在需要通过一种称为 BloggsCal ......
定义:
简单工厂模式:将调用者和创建者分离,实现解耦,调用者直接向工厂请求,通过工厂去选择需要实例化的对象,用一个单独的类来做这个创建实例的过程。
代码实例:
问题:假设一个关于个人事务管理的项目中有许多类型的对象,其中一个是 appointment 对象,现在需要通过一种称为 bloggscal 的格式进行预约数据的交互。后面可能还需要处理更多的数据格式,比如 megacal 格式。
1、创建一个抽象类 apptencoder
/** * 抽象类 * class apptencoder */ abstract class apptencoder { abstract public function encode(); }
2、创建 bloggscal 格式处理类
/** * bloggscal 格式处理类 * class bloggsapptencoder */ class bloggsapptencoder extends apptencoder { public function encode() { // todo: implement encode() method. return "appointment data encoded in bloggscal format\n"; } }
3、创建 megacal 格式处理类
/** * megacal 格式处理类 * class megaapptencoder */ class megaapptencoder extends apptencoder { public function encode() { // todo: implement encode() method. return "appointment data encoded in megacal format\n"; } }
4、创建工厂类 commsmanager
/** * 工厂类 * class commsmanager */ class commsmanager { const bloggs = 1; const mega = 2; private $model; /** * commsmanager constructor. * @param $model */ public function __construct($model) { $this->model = $model; } /** * 通过工厂去选择需要实例化的对象 */ public function getapptencoder() { switch ($this->model) { case (self::bloggs): return new bloggsapptencoder(); default: return new megaapptencoder(); } } }
5、调用:
$man = new commsmanager(commsmanager::bloggs); print $man->getapptencoder()->encode(); $man = new commsmanager(commsmanager::mega); print $man->getapptencoder()->encode();
6、结果:
appointment data encoded in bloggscal format appointment data encoded in megacal format
如果后面需要新增一种格式处理,则需要新增一个相应的格式处理类,再到工厂类中增加相应的实例化调用就可以了。
总结:
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
但刚才也说了,如果新增一种格式处理,是要修改工厂类的。这就等于说,我们不但对扩展开放了,对修改也开放了,因此违背了“开放-封闭原则”。这时可以使用工厂方法模式。