• PHP设计模式三:原型设计模式


    一、什么是原型设计模式

      原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的。原型设计模式的目的是通过使用克隆以减少

    实例化对象的开销。

      在原型设计模式中,Client类是不可缺少的一部分。

      PHP有一个内置的克隆方法__clone()可以在设计模式中使用,但是不能直接访问,使用clone关键字即可。克隆不会启动构造函数。

     

    二、什么时候使用原型设计模式

      如果一个项目要求你创建某个原型对象的多个实例,就可以使用原型设计模式。

     

    三、原型设计模式实例

      这里以现代企业组织为例:

    <?php
    /**
    *	原型设计模式
    *                以现代企业组织为例
    **/
    
    //部门抽象类
    abstract class IAcmePrototype
    {
    	protected $id;      //员工ID号
    	protected $name;    //员工名字
    	protected $dept;    //员工部门
    
    	//克隆方法
    	abstract function __clone();
    
    	//员工部门设置方法
    	abstract function setDept($orgCode);
    	//员工部门获取方法
    	public function getDept()
    	{
    		return $this->dept;
    	}
    
    	//员工ID号设置方法
    	public function setId($id)
    	{
    		$this->id = $id;
    	}
    	//员工ID号获取方法
    	public function getId()
    	{
    		return $this->id;
    	}
    
    	//员工名字设置方法
    	public function setName($name)
    	{
    		$this->name = $name;
    	}
    	//员工名字获取方法
    	public function getName()
    	{
    		return $this->name;
    	}
    }
    
    //市场部类
    class Marketing extends IAcmePrototype
    {
    	const UNIT = "Marketing";    //标识
    
    	//市场部门类别
    	private $sales = "sales";
    	private $promotion = "promotion";
    	private $strategic = "strategic planning";
    
    	//克隆函数
    	function __clone()
    	{
    	}
    
    	//部门设置函数
    	public function setDept($orgCode)
    	{
    		switch($orgCode)
    		{
    			case 101:
    					$this->dept = $this->sales;
    					break;
    			case 102:
    					$this->dept = $this->promotion;
    					break;
    			case 103:
    					$this->dept = $this->strategic;
    					break;
    			default:
    					$this->dept = "Unrecognized Marketing";
    		}
    	}
    }
    
    //管理部类
    class Management extends IAcmePrototype
    {
    	const UNIT = "Management";
    	private $research = "research";
    	private $plan = "planning";
    	private $operations = "operations";
    
    	function __clone()
    	{
    	}
    
    	public function setDept($orgCode)
    	{
    		switch($orgCode)
    		{
    			case 201:
    					$this->dept = $this->research;
    					break;
    			case 202:
    					$this->dept = $this->plan;
    					break;
    			case 203:
    					$this->dept = $this->operations;
    					break;
    			default:
    					$this->dept = "Unrecognized Marketing";
    		}
    	}
    }
    
    //工厂部类
    class Engineering extends IAcmePrototype
    {
    	const UNIT = "Engineering";
    	private $development = "programming";
    	private $design = "digital artwork";
    	private $sysAd = "system administration";
    
    	function __clone()
    	{
    	}
    
    	public function setDept($orgCode)
    	{
    		switch($orgCode)
    		{
    			case 301:
    					$this->dept = $this->development;
    					break;
    			case 302:
    					$this->dept = $this->design;
    					break;
    			case 303:
    					$this->dept = $this->sysAd;
    					break;
    			default:
    					$this->dept = "Unrecognized Marketing";
    		}
    	}
    }
    
    //客户类
    class Client
    {
    	private $market;    //市场部类实例
    	private $manage;    //管理部类实例
    	private $engineer;  //工厂部类实例
    
    	//构造函数
    	public function __construct()
    	{
    		$this->makeConProto();
    
    		//市场部类实例克隆
    		$Tess = clone $this->market;
    		$this->setEmployee($Tess,"Tess Smith",101,"ts101-1234");
    		$this->showEmployee($Tess);
    
    		$Jacob = clone $this->market;
    		$this->setEmployee($Jacob,"Jacob Jones",102,"jj101-2234");
    		$this->showEmployee($Jacob);
    
    		//管理部类实例克隆
    		$Ricky = clone $this->manage;
    		$this->setEmployee($Ricky,"Ricky Rodrigues",203,"rr203-5634");
    		$this->showEmployee($Ricky);
    
    		//工程部类实例克隆
    		$Olivia = clone $this->engineer;
    		$this->setEmployee($Olivia,"Olivia perez",302,"op302-1278");
    		$this->showEmployee($Olivia);
    
    		$John = clone $this->engineer;
    		$this->setEmployee($John,"John Jackson",301,"jj301-1454");
    		$this->showEmployee($John);
    	}
    
    	//实例化部门对象
    	private function makeConProto()
    	{
    		$this->market = new Marketing();
    		$this->manage = new Management();
    		$this->engineer = new Engineering();
    	}
    
    	//员工信息设置方法
    	private function setEmployee(IAcmePrototype $employee,$name,$dept,$id)
    	{
    		$employee->setName($name);
    		$employee->setDept($dept);
    		$employee->setId($id);
    	}
    
    	//员工信息显示方法
    	private function showEmployee(IAcmePrototype $employee)
    	{
    		echo $employee->getName() . '<br />';
    		echo $employee->getDept() . ": " . $employee::UNIT . '<br />';
    		echo $employee->getId() . '<br />';
    	}
    }
    
    $client = new Client();
    ?>
    

      

     

  • 相关阅读:
    如何将php数组或者对象传递给javascript
    js函数定时器,定时读取系统实时连接数
    采用highchart js+flot+rrd生成cpu、mem状态监控图
    jquery动态加载 去除js
    js控制href内容的连接内容的变化
    js动态控制table的tr,td增加及删除
    php生成PDF文件(FPDF)
    .NET 单点登录开源项目
    WF控制台工作流(2)
    WF控制台工作流(1)
  • 原文地址:https://www.cnblogs.com/wujuntian/p/4904262.html
Copyright © 2020-2023  润新知