浅析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 相关文章推荐
如何跨站抓取别的站点的页面的补充
Oct 09 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
ThinkPHP让分页保持搜索状态的方法
Jul 02 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
Mar 18 PHP
从wamp到xampp的升级之路
Apr 08 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
PHP中Trait及其应用详解
Feb 14 PHP
php查询及多条件查询
Feb 26 PHP
php实现登录页面的简单实例
Sep 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
桌面中心(三)修改数据库
2006/10/09 PHP
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP获取真实客户端的真实IP
2017/03/07 PHP
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
基于jquery & json的省市区联动代码
2012/06/26 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
jquery实现左右滑动菜单效果代码
2015/08/27 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python实现分页效果
2017/10/25 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
python动态视频下载器的实现方法
2019/09/16 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
python unichr函数知识点总结
2020/12/16 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
HTML5 Blob对象的具体使用
2020/05/22 HTML / CSS
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
如何用PHP实现邮件发送
2012/12/26 面试题
小班秋游活动方案
2014/02/22 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书