• php实现工厂模式


    设计模式-使用php实现工厂方法模式

    【总结】
    创建模式
    定义一个接口,用于创建一个对象,化哪一个类。Factory Method使用一个类的实例化延迟到其子类【GOF95】

    【结构图】

    【主要角色】
    抽象产品(Product)角色:详细产品对象共同拥有的父类或接口
    详细产品(Concrete Product)角色:实现抽象产品角色所定义的接口。而且工厂方法模式所创建的每个对象都是某详细产品对象的实例
    抽象工厂(Creator)角色:模式中不论什么创建对象的工厂类都要实现这个接口。它声明了工厂方法,该方法返回一个Product类型的对象。
    Creator也能够定义一个工厂方法的缺省实现,它返回一个缺省的的ConcreteProduct对象
    详细工厂(Concrete Creator)角色:实现抽象工厂接口。详细工厂角色与应用逻辑相关。由应用程序直接调用以创建产品对象。
    【优缺点】
    长处:工厂方法模式能够同意系统在不改动工厂角色的情况下引进新产品。
    缺点:客户可能只为了创建一个特定的ConcreteProduct对象,就不得不创建一个Creator子类
    【适用性】
    1、当一个类不知道它所必须创建的对象的类的时候
    2、当一个类希望由它的子类来指定它所创建的对象的时候
    3、当类将创建对象的职责托付给多个帮助子类的某一个,而且你希望将哪一个帮助子类是代理者这一信息局部化的时候

    【工厂模式php实例】

    <?php
     /**
     * 工厂方法模式
     * -------------
     * @author 		zhaoxuejie <zxj198468@gmail.com>
     * @package 	design pattern 
     * @version 	v1.0 2011-12-14
     */
    
    //抽象产品
    interface Work {
    	public function doWork(); 
    }
    
    //详细产品实现
    class Student implements Work {
    	
    	function doWork(){
    		echo "学生做作业!
    ";
    	}
    }
    
    class Teacher implements Work {
    	
    	function doWork(){
    		echo "老师批改作业!
    ";
    	}
    }
    
    //抽象工厂
    interface WorkerFactory {
    	public function getWorker();
    }
    
    //详细抽象工厂实现
    class StudentFactory {
    	
    	function getWorker(){
    		return new Student();
    	}
    }
    
    class TeacherFactory {
    	function getWorker(){
    		return new Teacher();
    	}
    }
    
    //client
    class Client {
    	
    	static function main() {
    		$s = new Student();
    		$s->doWork();
    		
    		$t = new Teacher();
    		$t->doWork();
    	}
    }
    
    Client::main();
    ?>
    

    【简单工厂模式】
    从设计模式的类型上来说,简单工厂模式是属于创建型模式。又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之中的一个。

    简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单有用的模式,能够理解为是不同工厂模式的一个特殊实现。
    【简单工厂模式php实例】

    <?

    php /** * 简单工厂模式 * ------------- * @author zhaoxuejie <zxj198468@gmail.com> * @package design pattern * @version v1.0 2011-12-14 */ interface Comput { public function getResults(); } //操作类 class Operation { protected $Number_A = 0; protected $Number_B = 0; protected $Result = 0; //赋值 function setNumber($Number_A, $Number_B){ $this->Number_A = $Number_A; $this->Number_B = $Number_B; } //清零 function clearResult(){ $this->Result = 0; } } //加法 class OperationAdd extends Operation implements Comput { function getResults(){ return $this->Result = ($this->Number_A + $this->Number_B); } } //减法 class OperationSub extends Operation implements Comput { function getResults(){ return $this->Result = ($this->Number_A - $this->Number_B); } } //乘法 class OperationMul extends Operation implements Comput { function getResults(){ return $this->Result = ($this->Number_A * $this->Number_B); } } //除法 class OperationDiv extends Operation implements Comput { function getResults(){ if(intval($this->Number_B) == 0){ return $this->Result = 'Error: Division by zero'; } return $this->Result = ($this->Number_A / $this->Number_B); } } //工厂 class OperationFactory { private static $obj; public static function CreateOperation($type){ try { $error = "Please input the '+', '-', '*', '/' symbols of Math."; switch($type){ case '+' : self::$obj = new OperationAdd(); break; case '-' : self::$obj = new OperationSub(); break; case '*' : self::$obj = new OperationMul(); break; case '/' : self::$obj = new OperationDiv(); break; default: throw new Exception($error); } return self::$obj; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), " "; exit; } } } //创建工厂的实例 $obj = OperationFactory::CreateOperation('*'); $obj->setNumber(3, 4); echo $obj->getResults(); ?

    >



  • 相关阅读:
    条款1:理解模板类型推导
    非受限联合体
    整型
    vector作为函数返回类型
    SQL Server数据库空间管理 (1)
    1085 PAT单位排行 (25 分
    1084 外观数列 (20 分)
    1083 是否存在相等的差 (20 分)
    1082 射击比赛 (20 分)
    1081 检查密码 (15 分)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4564304.html
Copyright © 2020-2023  润新知