浅析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 相关文章推荐
oracle资料库函式库
Oct 09 PHP
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
php Rename 更改文件、文件夹名称
May 24 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
Dec 05 PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 PHP
php 使用file_get_contents读取大文件的方法
Nov 13 PHP
php 的反射详解及示例代码
Aug 25 PHP
PHP构造二叉树算法示例
Jun 21 PHP
基于swoole实现多人聊天室
Jun 14 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
PHP7 参数处理机制修改
Mar 09 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
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
写的htc的数据表格
2007/01/20 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
jQuery手指滑动轮播效果
2016/12/22 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
flask框架视图函数用法示例
2018/07/19 Python
Django 大文件下载实现过程解析
2019/08/01 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
免税水晶:Duty Free Crystal
2019/05/13 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
考试没考好检讨书
2014/01/31 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
Java中API的使用方法详情
2022/04/06 Java/Android