您的位置:首页 > 编程语言 > PHP开发

php实现工厂模式

2014-11-11 14:33 190 查看
设计模式-使用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();
}
}

//client
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();
?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: