您的位置:首页 > 其它

设计模式之创建型模式―― 1.1 简单工厂模式

2015-02-17 18:32 405 查看
<?php

/**
* 1.1 简单工厂模式
*
* 解决的问题:
* 	如何解决多个类实例化对象的问题。
* 	注意:因为是简单工厂模式,所以要实例
* 		  化的类不能太多,否则请使用1.2节
* 		  的工厂方法模式。
*
* 解决方案:
* 	建立一个工厂(即一个工厂类),通过参数的
* 	传递动态决定应该创建哪一个产品类(这些
* 	产品类继承自一个父类或接口)的实例。
*
*
* 该模式中包含三种角色:
* 	注:这里的角色指的就是类!
* 	1. 抽象产品角色
* 		职责:它是工厂角色所创建的对象的父
* 		类。负责描述所有实例所共有的公共接
* 		口。
* 	2. 具体产品角色
* 		职责:它是工厂角色所要创建的目标。
* 			  负责具体产品的实例的所属,也
* 			  就是说工厂角色所创建的对象实
* 			  例属于哪个产品角色。
*   3. 工厂角色
* 		职责:它是简单工厂模式的核心。
* 			  负责实现创建所有实例的内部逻
* 			  辑.此工厂类中创建产品类的方法
* 			  可以被客户端直接调用,以创建
* 			  所需的产品对象。
*
* 	优点:
* 		1. 具体产品的对象的创建有工厂角色统
* 		   一完成,无需客户端再直接创建,使
* 		   得客户端解放了出来。
* 		2. 明确了客户端和服务端的具体分工。
*
* 	缺点:
* 		1. 所有实例的创建都集中在了工厂类中
* 		   这违反了高内聚原则。
* 		2. 如果添加新的产品类,那么工厂类就
* 		   要随之改变。
* 		3. 要事先知道有哪些类可以创建。
*
* 	使用场景:
* 		1. 工厂类负责创建的对象比较少;
* 		2. 客户端知道传入工厂类的参数,且
* 		   对如何创建的逻辑不关心。
* 		3. 由于简单工厂很容易违反高内聚责
* 		   任分配原则,因此一般只在很简单
* 		   的情况下应用。
*/
//抽象产品角色
abstract class Operation {

public static $numA;
public static $numB;

abstract protected function getResult();

}

//具体产品角色
/**
* 加法子类
*/
class Add extends Operation {
public function getResult(){
// return parent::$numA + $this->numB;
return parent::$numA + parent::$numB;
}
}
/**
* 减法子类
*/
class Minus extends Operation {
public function getResult(){
return parent::$numA - parent::$numB;
}
}

/**
* 乘法子类
*/
class Mul extends Operation {
public function getResult(){
return parent::$numA * parent::$numB;
}
}

/**
* 除法子类
*/
class Div extends Operation {
public function getResult(){
if(parent::$numB != 0){
return parent::$numA / parent::$numB;
}
}
}

//工厂角色
// 定义一个类专门用于实例化加减乘除四个类
class OperFactry{
public static function createObj($oper){
switch ($oper) {
case '+':
$obj=new Add();
break;
case '-':
$obj=new Minus();
break;
case '*':
$obj=new Mul();
break;
case '/':
$obj=new Div();
break;
default:
return;
}
return $obj;
}
}

//客户端

Operation::$numA=2;
Operation::$numB=3;

/**
* 无简单工厂类:
* 	此时,我们实现加减乘除运算时,要分别实例
* 	个子类,然后再得到结果。这时,代码有重复
* 	而且也显得比零乱,而且要事先知道有哪些类
* 	可以被创建。
*/

$add=new Add();
echo $add->getResult().'<br/>';
$minus=new Minus();
echo $minus->getResult().'<br/>';
$mul=new Mul();
echo $mul->getResult().'<br/>';
$div=new Div();
echo $div->getResult().'<br/>';

/**
* 有简单工厂类:
* 	此时我们仅仅需要改变传递的参数即可。代码
* 	简单清晰。它也要事先知道可以创建哪些类。
*/

$oper=OperFactry::createObj('-');
echo $oper->getResult();

?>


本文出自 “一切皆有可能” 博客,请务必保留此出处http://noican.blog.51cto.com/4081966/1614768
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐