PHP设计模式—工厂模式之简单工厂模式
2021-04-03 05:27
标签:根据 实例 msm 优点 逻辑判断 扩展 form 选择 cal 简单工厂模式:将调用者和创建者分离,实现解耦,调用者直接向工厂请求,通过工厂去选择需要实例化的对象,用一个单独的类来做这个创建实例的过程。 问题:假设一个关于个人事务管理的项目中有许多类型的对象,其中一个是 Appointment 对象,现在需要通过一种称为 BloggsCal 的格式进行预约数据的交互。后面可能还需要处理更多的数据格式,比如 MegaCal 格式。 1、创建一个抽象类 ApptEncoder 2、创建 BloggsCal 格式处理类 3、创建 MegaCal 格式处理类 4、创建工厂类 CommsManager 5、调用: 6、结果: 如果后面需要新增一种格式处理,则需要新增一个相应的格式处理类,再到工厂类中增加相应的实例化调用就可以了。 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。 PHP设计模式—工厂模式之简单工厂模式 标签:根据 实例 msm 优点 逻辑判断 扩展 form 选择 cal 原文地址:https://www.cnblogs.com/woods1815/p/12545603.html定义:
代码实例:
/**
* 抽象类
* Class ApptEncoder
*/
abstract class ApptEncoder
{
abstract public function encode();
}
/**
* BloggsCal 格式处理类
* Class BloggsApptEncoder
*/
class BloggsApptEncoder extends ApptEncoder
{
public function encode()
{
// TODO: Implement encode() method.
return "Appointment data encoded in BloggsCal format\n";
}
}
/**
* MegaCal 格式处理类
* Class MegaApptEncoder
*/
class MegaApptEncoder extends ApptEncoder
{
public function encode()
{
// TODO: Implement encode() method.
return "Appointment data encoded in MegaCal format\n";
}
}
/**
* 工厂类
* 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();
}
}
}
$man = new CommsManager(CommsManager::BLOGGS);
print $man->getApptEncoder()->encode();
$man = new CommsManager(CommsManager::MEGA);
print $man->getApptEncoder()->encode();
Appointment data encoded in BloggsCal format
Appointment data encoded in MegaCal format
总结:
但刚才也说了,如果新增一种格式处理,是要修改工厂类的。这就等于说,我们不但对扩展开放了,对修改也开放了,因此违背了“开放-封闭原则”。这时可以使用工厂方法模式。
上一篇:js中的深拷贝与浅拷贝
下一篇:16-CSS选择符详解