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();
    ?>
    


  • 相关阅读:
    ZOJ 2158 Truck History
    Knight Moves (zoj 1091 poj2243)BFS
    poj 1270 Following Orders
    poj 2935 Basic Wall Maze (BFS)
    Holedox Moving (zoj 1361 poj 1324)bfs
    ZOJ 1083 Frame Stacking
    zoj 2193 Window Pains
    hdu1412{A} + {B}
    hdu2031进制转换
    openjudge最长单词
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3919223.html
Copyright © 2011-2022 走看看