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

  

 

posted @ 2015-10-23 13:26  疯一样的狼人  阅读(176)  评论(0编辑  收藏  举报