浅析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 程序员应该使用的10个组件
Oct 31 PHP
用Php编写注册后Email激活验证的实例代码
Mar 11 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
PHPer 需要了解的 5 个 Composer 小技巧
Aug 18 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 PHP
thinkPHP基于ajax实现的菜单与分页示例
Jul 12 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 PHP
PHP7移除的扩展和SAPI
Mar 09 PHP
Jsonp劫持学习
Apr 01 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
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php集成环境xampp中apache无法启动问题解决方案
2014/11/18 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
在Python中移动目录结构的方法
2016/01/31 Python
浅谈Python数据类型之间的转换
2016/06/08 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
python关闭占用端口方式
2019/12/17 Python
python实现跨年表白神器--你值得拥有
2021/01/04 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
公共事业管理本科生求职信
2013/10/07 职场文书
客服专员岗位职责范本
2013/11/29 职场文书
工程管理专业个人求职信范文
2013/12/07 职场文书
会计实习生自我鉴定
2013/12/12 职场文书
外国人聘用意向书
2014/04/01 职场文书
仓库规划计划书
2014/04/28 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
python实现过滤敏感词
2021/05/08 Python
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
PHP获取学生成绩的方法
2021/11/17 PHP
Spring Boot 实现 WebSocket
2022/04/30 Java/Android
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL