浅析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自动选择 连接本地还是远程数据库
Dec 02 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 PHP
php5.2以下版本无json_decode函数的解决方法
May 25 PHP
修改WordPress中文章编辑器的样式的方法详解
Dec 15 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
php layui实现前端多图上传实例
Jul 30 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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
判断PHP数组是否为空的代码
2011/09/08 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
js获取页面description的方法
2015/05/21 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
javascript事件模型介绍
2016/05/31 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
2017/06/01 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
python和bash统计CPU利用率的方法
2015/07/10 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
python数据挖掘需要学的内容
2019/06/23 Python
简单了解python反射机制的一些知识
2019/07/13 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
新领导上任欢迎词
2014/01/13 职场文书
关于保护环境的建议书
2014/05/13 职场文书
2015年教师新年寄语
2014/12/08 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
检讨书之工作不认真
2019/08/14 职场文书
创业计划书之密室逃脱
2019/11/08 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
利用Java连接Hadoop进行编程
2022/06/28 Java/Android