PHP设计模式—工厂模式之简单工厂模式
? 定义:简单工厂模式:将调用者和创建者分离,实现解耦,调用者直接向工厂请求,通过工厂去选择需要实例化的对象,用一个单独的类来做这个创建实例的过程。 ? 代码实例:问题:假设一个关于个人事务管理的项目中有许多类型的对象,其中一个是 Appointment 对象,现在需要通过一种称为 BloggsCal 的格式进行预约数据的交互。后面可能还需要处理更多的数据格式,比如 MegaCal 格式。 1、创建一个抽象类 ApptEncoder /** * 抽象类 * Class ApptEncoder */ abstract class ApptEncoder { public function encode(); } 2、创建 BloggsCal 格式处理类 * * BloggsCal 格式处理类 * Class BloggsApptEncoder class BloggsApptEncoder extends encode() { // TODO: Implement encode() method. return "Appointment data encoded in BloggsCal formatn"; } } 3、创建 MegaCal 格式处理类 * * MegaCal 格式处理类 * Class MegaApptEncoder class MegaApptEncoder return "Appointment data encoded in MegaCal formatn"; } } 4、创建工厂类 CommsManager * * 工厂类 * Class CommsManager CommsManager { const BLOGGS = 1; const MEGA = 2private $model; * * CommsManager constructor. * @param $model */ function __construct() { $this->model = ; } * * 通过工厂去选择需要实例化的对象 getApptEncoder() { switch ($this->model) { case (self::BLOGGS): return new BloggsApptEncoder(); default: MegaApptEncoder(); } } } 5、调用: $man = new CommsManager(CommsManager::BLOGGS); print $man->getApptEncoder()->encode(); MEGA); $man->getApptEncoder()->encode(); 6、结果: Appointment data encoded in BloggsCal format
Appointment data encoded in MegaCal format
如果后面需要新增一种格式处理,则需要新增一个相应的格式处理类,再到工厂类中增加相应的实例化调用就可以了。 ? 总结:简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。 ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |