<?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(); ?>
时间: 2024-10-29 19:07:00