zoukankan      html  css  js  c++  java
  • 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();
    ?>
    


  • 相关阅读:
    洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】
    13.1.2 拷贝赋值运算符、析构函数、三/五法则、阻止拷贝
    拷贝构造函数和深拷贝例子
    拷贝构造函数和深拷贝例子
    动态数组、allocator 类
    智能指针和异常、 weak_ptr、unique_ptr
    12.动态内存和智能指针、 直接管理内存、shared_ptr和new结合使用
    8.2 文件输入输出
    7.3 类的其他特性 笔记
    8.1.1 IO
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4027224.html
Copyright © 2011-2022 走看看