浅析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 相关文章推荐
Apache设置虚拟WEB
Oct 09 PHP
php5 pdo新改动加载注意事项
Sep 11 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
批量获取memcache值并按key的顺序返回的实现代码
Jun 14 PHP
分享一个PHP数据流应用的简单例子
Jun 01 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
php之Memcache学习笔记
Jun 17 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
PHP文件上传类实例详解
Apr 08 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
Laravel学习教程之request validation的编写
Oct 25 PHP
PHP接入支付宝接口失效流程详解
Nov 10 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
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
php-app开发接口加密详解
2018/04/18 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
php测试kafka项目示例
2020/02/06 PHP
javascript 二进制运算技巧解析
2012/11/27 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
Python MD5加密实例详解
2017/08/02 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Opencv+Python识别PCB板图片的步骤
2021/01/07 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
营销与策划应届生求职信
2013/11/04 职场文书
跟单文员的岗位职责
2013/11/14 职场文书
审计专业自荐信范文
2014/04/21 职场文书
环卫个人总结
2015/03/03 职场文书
党支部工作总结2015
2015/04/01 职场文书
材料员岗位职责范本
2015/04/11 职场文书
党员进社区活动总结
2015/05/07 职场文书
Vue项目中如何封装axios(统一管理http请求)
2021/05/02 Vue.js
Python实现简单的猜单词
2021/06/15 Python
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android