博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php实现工厂模式
阅读量:5290 次
发布时间:2019-06-14

本文共 3228 字,大约阅读时间需要 10 分钟。

设计模式-使用php实现工厂方法模式
【概要】
创建型模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】

【结构图】

【主要角色】
抽象产品(Product)角色:详细产品对象共同拥有的父类或接口
详细产品(Concrete Product)角色:实现抽象产品角色所定义的接口,而且工厂方法模式所创建的每个对象都是某详细产品对象的实例
抽象工厂(Creator)角色:模式中不论什么创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。
Creator也能够定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象
详细工厂(Concrete Creator)角色:实现抽象工厂接口,详细工厂角色与应用逻辑相关,由应用程序直接调用以创建产品对象。
【优缺点】
长处:工厂方法模式能够同意系统在不改动工厂角色的情况下引进新产品。
缺点:客户可能只为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类
【适用性】
1、当一个类不知道它所必须创建的对象的类的时候
2、当一个类希望由它的子类来指定它所创建的对象的时候
3、当类将创建对象的职责托付给多个帮助子类的某一个,而且你希望将哪一个帮助子类是代理者这一信息局部化的时候

【工厂模式php实例】

* @package design pattern * @version v1.0 2011-12-14 *///抽象产品interface Work { public function doWork(); }//详细产品实现class Student implements Work { function doWork(){ echo "学生做作业!\n"; }}class Teacher implements Work { function doWork(){ echo "老师批改作业!\n"; }}//抽象工厂interface WorkerFactory { public function getWorker();}//详细抽象工厂实现class StudentFactory { function getWorker(){ return new Student(); }}class TeacherFactory { function getWorker(){ return new Teacher(); }}//clientclass Client { static function main() { $s = new Student(); $s->doWork(); $t = new Teacher(); $t->doWork(); }}Client::main();?>
【简单工厂模式】
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之中的一个。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单有用的模式,能够理解为是不同工厂模式的一个特殊实现。
【简单工厂模式php实例】

* @package design pattern * @version v1.0 2011-12-14 */interface Comput { public function getResults(); }//操作类class Operation { protected $Number_A = 0; protected $Number_B = 0; protected $Result = 0; //赋值 function setNumber($Number_A, $Number_B){ $this->Number_A = $Number_A; $this->Number_B = $Number_B; } //清零 function clearResult(){ $this->Result = 0; }}//加法class OperationAdd extends Operation implements Comput { function getResults(){ return $this->Result = ($this->Number_A + $this->Number_B); }}//减法class OperationSub extends Operation implements Comput { function getResults(){ return $this->Result = ($this->Number_A - $this->Number_B); }}//乘法class OperationMul extends Operation implements Comput { function getResults(){ return $this->Result = ($this->Number_A * $this->Number_B); }}//除法class OperationDiv extends Operation implements Comput { function getResults(){ if(intval($this->Number_B) == 0){ return $this->Result = 'Error: Division by zero'; } return $this->Result = ($this->Number_A / $this->Number_B); }}//工厂class OperationFactory { private static $obj; public static function CreateOperation($type){ try { $error = "Please input the '+', '-', '*', '/' symbols of Math."; switch($type){ case '+' : self::$obj = new OperationAdd(); break; case '-' : self::$obj = new OperationSub(); break; case '*' : self::$obj = new OperationMul(); break; case '/' : self::$obj = new OperationDiv(); break; default: throw new Exception($error); } return self::$obj; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; exit; } }}//工厂创建实例$obj = OperationFactory::CreateOperation('*');$obj->setNumber(3, 4);echo $obj->getResults();?>

转载于:https://www.cnblogs.com/mfrbuaa/p/4348423.html

你可能感兴趣的文章
一个杯子的测试用例
查看>>
前端面试总结——http、html和浏览器篇
查看>>
CS0103: The name ‘Scripts’ does not exist in the current context解决方法
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
openCV(一)---将openCV框架导入iOS工程中
查看>>
Spring面试题
查看>>
窥视SP2010--第一章节--SP2010开发者路线图
查看>>
一步步学习微软InfoPath2010和SP2010--第五章节--添加逻辑和规则到表单(2)--处理验证与格式化...
查看>>
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。...
查看>>
MVC,MVP 和 MVVM 的图示,区别
查看>>
IDEA快速实现接口快捷方式
查看>>
用默认的打开方式打开本地文件
查看>>
JavaScript-jQuery报TypeError $(...) is null错误(jQuery失效)解决办法
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
SAP销售模块塑工常见问题和解决方案(自己收藏)
查看>>
事后诸葛亮博客
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
Round Numbers
查看>>