浅析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.MVC的模板标签系统(三)
Sep 05 PHP
拼音码表的生成
Oct 09 PHP
非常不错的MySQL优化的8条经验
Mar 24 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
Mar 24 PHP
php 删除一个数组中的某个值.兼容多维数组!
Feb 18 PHP
php中定时计划任务的实现原理
Jan 08 PHP
深入PHP许愿墙模块功能分析
Jun 25 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
PHP借助phpmailer发送邮件
May 11 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
PHP中Notice错误常见解决方法
Apr 28 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
codeigniter数据库操作函数汇总
2014/06/12 PHP
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
JavaScript 私有成员分析
2009/01/13 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
功能完善的小程序日历组件的实现
2020/03/31 Javascript
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
Python实现删除文件但保留指定文件
2015/06/21 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
python实现简易淘宝购物
2019/11/22 Python
Tensorflow轻松实现XOR运算的方式
2020/02/03 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
CSS3 实现的加载动画
2020/12/07 HTML / CSS
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
写给女朋友的道歉信
2014/01/12 职场文书
承诺书怎么写
2014/03/26 职场文书
应届大专生求职信
2014/06/26 职场文书
文明好少年事迹材料
2014/08/19 职场文书
年终晚会活动方案
2014/08/21 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书