设计模式之创建型模式—— 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();
?>
转载于:https://blog.51cto.com/noican/1614768