浅析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 相关文章推荐
Zend 输出产生XML解析错误
Mar 03 PHP
PHP 函数语法介绍一
Jun 14 PHP
PHP扩展编写点滴 技巧收集
Mar 09 PHP
apache+php+mysql安装配置方法小结
Aug 01 PHP
五款常用mysql slow log分析工具的比较分析
May 22 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
Aug 31 PHP
php命名空间学习详解
Feb 27 PHP
php实现建立多层级目录的方法
Jul 19 PHP
php的常量和变量实例详解
Jun 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中MD5函数使用实例代码
2008/06/07 PHP
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
PHP json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
web.py中调用文件夹内模板的方法
2014/08/26 Python
Python实现控制台输入密码的方法
2015/05/29 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python利用sklearn包编写决策树源代码
2017/12/21 Python
python的mysql数据库建立表与插入数据操作示例
2019/09/30 Python
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
亮剑精神演讲稿
2014/05/23 职场文书
房地产端午节活动方案
2014/08/24 职场文书
欢迎家长标语
2014/10/08 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
观后感的写法
2015/06/19 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL
redis cluster支持pipeline的实现思路
2021/06/23 Redis