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

<?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();

?>


你可能感兴趣的:(设计模式,简单工厂模式)