设计模式-使用php实现工厂方法模式
2014-10-12 23:40
806 查看
【概要】
创建型模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】
【结构图】
【主要角色】
抽象产品(Product)角色:具体产品对象共有的父类或接口
具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,并且工厂方法模式所创建的每一个对象都是某具体产品对象的实例
抽象工厂(Creator)角色:模式中任何创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。
Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象
具体工厂(Concrete Creator)角色:实现抽象工厂接口,具体工厂角色与应用逻辑相关,由应用程序直接调用以创建产品对象。
【优缺点】
优点:工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
缺点:客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类
【适用性】
1、当一个类不知道它所必须创建的对象的类的时候
2、当一个类希望由它的子类来指定它所创建的对象的时候
3、当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
【工厂模式php实例】
【简单工厂模式】
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
【简单工厂模式php实例】
创建型模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】
【结构图】
【主要角色】
抽象产品(Product)角色:具体产品对象共有的父类或接口
具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,并且工厂方法模式所创建的每一个对象都是某具体产品对象的实例
抽象工厂(Creator)角色:模式中任何创建对象的工厂类都要实现这个接口,它声明了工厂方法,该方法返回一个Product类型的对象。
Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象
具体工厂(Concrete Creator)角色:实现抽象工厂接口,具体工厂角色与应用逻辑相关,由应用程序直接调用以创建产品对象。
【优缺点】
优点:工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
缺点:客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类
【适用性】
1、当一个类不知道它所必须创建的对象的类的时候
2、当一个类希望由它的子类来指定它所创建的对象的时候
3、当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候
【工厂模式php实例】
<?php /** * 工厂方法模式 * ------------- * @author zhaoxuejie <zxj198468@gmail.com> * @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(); } } //客户端 class Client { static function main() { $s = new Student(); $s->doWork(); $t = new Teacher(); $t->doWork(); } } Client::main(); ?>
【简单工厂模式】
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
【简单工厂模式php实例】
<?php /** * 简单工厂模式 * ------------- * @author zhaoxuejie <zxj198468@gmail.com> * @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(); ?>
相关文章推荐
- PHP设计模式笔记:使用PHP实现适配器模式
- PHP和golang实现设计模式-工厂方法模式
- php实现设计模式之 工厂方法模式
- php中使用接口实现工厂设计模式的代码
- PHP设计模式笔记:使用PHP实现单例模式
- php使用接口实现工厂设计模式
- PHP设计模式笔记:使用PHP实现工厂模式
- 通过例子学设计模式之--工厂方法模式以及使用场景说明(C++实现)
- php中使用接口实现工厂设计模式的代码
- 慕课网----大话PHP设计模式 二(数据结构的php实现,链式操作,php魔方方法的使用)
- 使用Object-C实现23种设计模式之工厂方法模式
- PHP设计模式笔记:使用PHP实现桥梁模式
- PHP设计模式笔记:使用PHP实现单例模式
- PHP设计模式笔记:使用PHP实现门面模式
- 《模式——工程化实现及扩展》(设计模式C# 版)《工厂方法模式 Factory Method》——“自我检验" 参考答案
- PHP设计模式之单例模式实现
- php数据库模式设计、数据库访问和使用数据库的业务逻辑解决方案
- Php设计模式之工厂模式(二)【工厂方法模式 Factory Method】
- 设计模式-PHP实现单件模式的几种方式
- 转[翻译]案例学习:仅使用Redis+PHP设计实现一个简单的Twitter