浅析php工厂模式


Posted in PHP onNovember 25, 2014

本系列文章来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。

设计模式的一般介绍在第一篇文章讲了,这里就不重复。

工厂模式

实现:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
应用场景:众多子类并且会扩充、创建方法比较复杂。

工厂模式分为三种:简单工厂、工厂方法、抽象工厂 ,

三种工厂的区别是,抽象工厂由多条产品线,而工厂方法只有一条产品线,是抽象工厂的简化。而工厂方法和简单工厂相对,大家初看起来好像工厂方法增加了许多代码但是实现的功能和简单工厂一样。但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。在分工时,核心工程师负责抽象工厂和抽象产品的定义,业务工程师负责具体工厂和具体产品的实现。只要抽象层设计的好,框架就是非常稳定的。

/**

 * 工厂模式

 */

//抽象产品

interface Person {

    public function getName(); 

}

//具体产品实现

class Teacher implements Person {

    function getName() {

        return "老师n";

    }

}

class Student implements Person {

    function getName() {

        return "学生n";

    }

}

//简单工厂

class SimpleFactory {

       public static function getPerson($type) {

              $person = null;

              if ($type == 'teacher') {

                     $person = new Teacher();

              } elseif ($type == 'student') {

                     $person = new Student();

              }

              return $person;

       }

}

//简单工厂调用

class SimpleClient {

       function main() {

              // 如果不用工厂模式,则需要提前指定具体类

              // $person = new Teacher();

              // echo $person->getName();

              // $person = new Student();

              // echo $person->getName();

              // 用工厂模式,则不需要知道对象由什么类产生,交给工厂去决定

              $person = SimpleFactory::getPerson('teacher');

              echo $person->getName();

              $person = SimpleFactory::getPerson('student');

              echo $person->getName();

       }

}

//工厂方法

interface CommFactory {

    public function getPerson();

}

//具体工厂实现

class StudentFactory implements CommFactory {

    function getPerson(){

        return new Student();

    }

}

class TeacherFactory implements CommFactory {

    function getPerson() {

        return new Teacher();

    }

}

//工厂方法调用

class CommClient {

    static function main() {

           $factory = new TeacherFactory();

           echo $factory->getPerson()->getName();

           $factory = new StudentFactory();

           echo $factory->getPerson()->getName();

    }

}

//抽象工厂模式另一条产品线

interface Grade {

       function getYear();

}

//另一条产品线的具体产品

class Grade1 implements Grade {

       public function getYear() {

              return '2003级';

       }

}

class Grade2 implements Grade {

       public function getYear() {

              return '2004级';

       }

}

//抽象工厂

interface AbstractFactory {

       function getPerson();

       function getGrade();

}

//具体工厂可以产生每个产品线的产品

class Grade1TeacherFactory implements AbstractFactory {

       public function getPerson() {

              return new Teacher();

       }

       public function getGrade() {

              return new Grade1();

       }

}

class Grade1StudentFactory implements AbstractFactory {

       public function getPerson() {

              return new Student();

       }

       public function getGrade() {

              return new Grade1();

       }

}

class Grade2TeacherFactory implements AbstractFactory {

       public function getPerson() {

              return new Teacher();

       }

       public function getGrade() {

              return new Grade2();

       }

}

//抽象工厂调用

class FactoryClient {

       function printInfo($factory) {

              echo $factory->getGrade()->getYear().$factory->getPerson()->getName();

       }

       function main() {

              $client = new FactoryClient();

              $factory = new Grade1TeacherFactory();

              $client->printInfo($factory);

              $factory = new Grade1StudentFactory();

              $client->printInfo($factory);

              $factory = new Grade2TeacherFactory();

              $client->printInfo($factory);

       }

}

//简单工厂

//SimpleClient::main();

//工厂方法

//CommClient::main();

//抽象工厂

FactoryClient::main();

小伙伴们了解了php设计模式中的工厂模式了吧,是不是挺简单呢,接下来的文章我们将介绍下创建者模式

PHP 相关文章推荐
配置PHP使之能同时支持GIF和JPEG
Oct 09 PHP
PHP网站提速三大“软”招
Oct 09 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 PHP
php实现的一个很好用HTML解析器类可用于采集数据
Sep 23 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
php传值赋值和传地址赋值用法实例分析
Jun 20 PHP
Yii2下session跨域名共存的解决方案
Feb 04 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 PHP
老生常谈PHP面向对象之标识映射
Jun 21 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
PDO::prepare讲解
Jan 29 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 #PHP
浅析php单例模式
Nov 25 #PHP
PHP魔术方法__GET、__SET使用实例
Nov 25 #PHP
php字符串截取函数用法分析
Nov 25 #PHP
浅谈ThinkPHP的URL重写
Nov 25 #PHP
ThinkPHP独立分组使用的注意事项
Nov 25 #PHP
php中in_array函数用法探究
Nov 25 #PHP
You might like
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
文本框回车提交与禁止提交示例
2013/09/27 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
举例说明JavaScript中的实例对象与原型对象
2016/03/11 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
Python 解析XML文件
2009/04/15 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
飞利浦法国官网:Philips法国
2019/07/10 全球购物
质量月活动策划方案
2014/03/10 职场文书
优秀食品类广告词
2014/03/19 职场文书
诚信承诺书范文
2014/03/27 职场文书
公证委托书模板
2014/04/03 职场文书
个人工作表现评语
2014/04/30 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
小学班主任个人总结
2015/03/03 职场文书
小学教师岗位职责
2015/04/02 职场文书
返乡农民工证明
2015/06/24 职场文书
golang 实现时间戳和时间的转化
2021/05/07 Golang
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python