浅析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
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
php Notice: Undefined index 错误提示解决方法
Aug 29 PHP
php引用地址改变变量值的问题
Mar 23 PHP
PHP合并两个数组的两种方式的异同
Sep 14 PHP
php递归删除目录下的文件但保留的实例分享
May 10 PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 PHP
PHP浮点数精度问题汇总
May 13 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
PHP实现的简单异常处理类示例
May 04 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 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 批量删除 sql语句
2009/06/05 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
php头像上传预览实例代码
2017/05/02 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
一个简单的node.js界面实现方法
2018/06/01 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
Python实现Dijkstra算法
2018/10/17 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
2019/06/21 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的方法
2014/04/03 HTML / CSS
阿拉伯书店:Jamalon
2019/07/24 全球购物
最新教师自我评价分享
2013/11/12 职场文书
土木工程专业个人求职信
2013/12/05 职场文书
护理工作感言
2014/01/16 职场文书
机关单位动员会主持词
2014/03/20 职场文书
政府个人对照检查材料
2014/08/28 职场文书
政风行风评议工作总结
2014/10/21 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
大学生见习总结报告
2015/06/24 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
教你一步步实现一个简易promise
2021/11/02 Javascript
mysql数据库隔离级别详解
2022/06/16 MySQL