浅析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 相关文章推荐
main.php
Dec 09 PHP
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
PHP通过header实现文本文件下载的代码
Aug 08 PHP
PHP的加密方式及原理
Jun 14 PHP
php中选择什么接口(mysql、mysqli)访问mysql
Feb 06 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
Jul 03 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
php rsa 加密,解密,签名,验签详解
Dec 06 PHP
php封装json通信接口详解及实例
Mar 07 PHP
PHP编程求最大公约数与最小公倍数的方法示例
May 29 PHP
php中curl和soap方式请求服务超时问题的解决
Jun 11 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
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
PHP 图片水印类代码
2012/08/27 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
制作特殊字的脚本
2006/06/26 Javascript
javascript脚本调试方法小结
2008/11/24 Javascript
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
Vue项目自动转换 px 为 rem的实现方法
2018/10/29 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
通过Python实现自动填写调查问卷
2017/09/06 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python的sys.path模块路径添加方式
2020/03/09 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
单位介绍信范文
2014/01/18 职场文书
优秀纪检干部材料
2014/08/27 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
初中优秀学生评语
2014/12/29 职场文书
旷课检讨书
2015/01/26 职场文书
稽核岗位职责
2015/02/10 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers