设计模式之创建型模式―― 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
相关文章推荐
- 《Android之大话设计模式》--设计模式 创建型模式 第一章:简单工厂模式
- 《Android之大话设计模式》--设计模式 创建型模式 第一章:简单工厂模式
- 设计模式(一)简单工厂(创建型)(Java&&PHP)
- 设计模式之简单工厂(创建型模式)
- 设计模式(2)-创建型-简单工厂,工厂,抽象工厂模式(Factory)
- 设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例)
- 创建型设计模式:简单工厂模式--分析优缺点
- Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)
- 设计模式(2)-创建型-简单工厂,工厂,抽象工厂模式(Factory)
- 【转】设计模式——创建型设计模式总结(简单工厂、普通工厂、抽象工厂、建造者、原型和单例)
- 设计模式学习札记(一):创建型模式之简单工厂模式
- 【设计模式基础】创建型模式 - 3 - 简单工厂(Simple Factory)
- 【创建型设计模式】-简单工厂方法设计模式
- 设计模式1:简单工厂模式【创建型】
- 《Android之大话设计模式》--设计模式 创建型模式 第一章:简单工厂模式
- 设计模式-创建型01-简单工厂
- 一、设计模式之工厂模式--简单工厂模式--创建型模式
- 设计模式(2)-创建型-简单工厂,工厂,抽象工厂模式(Factory)
- 设计模式(2)-创建型-简单工厂,工厂,抽象工厂模式(Factory)
- Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)