浅析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 相关文章推荐
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
如何使用php输出时间格式
Aug 31 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
PHP中比较时间大小实例
Aug 21 PHP
php cookie中点号(句号)自动转为下划线问题
Oct 21 PHP
php自动给网址加上链接的方法
Jun 02 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
laravel邮件发送的实现代码示例
Jan 31 PHP
浅谈Laravel中使用Slack进行异常通知
May 29 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 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读取文件内容的几种方法详解
2013/06/26 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
jQuery 方法大全方便学习参考
2010/02/25 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
python继承和抽象类的实现方法
2015/01/14 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
python实现弹窗祝福效果
2019/04/07 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
高考考python编程是真的吗
2020/07/20 Python
HTML5未来发展趋势
2016/02/01 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
英国女士家居服网站:hush
2017/08/09 全球购物
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
华为慧通面试题
2012/09/11 面试题
如何用JQuery进行表单验证
2013/05/29 面试题
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
《梅花魂》教学反思
2014/04/30 职场文书
自主招生学校推荐信
2014/09/26 职场文书
1000字打架检讨书
2014/11/03 职场文书
2015年全民创业工作总结
2015/07/23 职场文书
初中政治教学工作总结
2015/08/13 职场文书