定义
和工厂模式类似,用来创建对象。但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建。
场景
大对象的创建。
优点
1、可以在运行时刻增加和删除产品
2、可以改变值或结构以指定新对象
3、减少子类的构造
4、用类动态配置应用
缺点
Prototype是的最主要的缺点就是每一个类必须包含一个克隆方法;
而且这个克隆方法需要对类的功能进行检测,这对于全新的类来说较容易,但对已有的类进行改造时将不是件容易的事情;
要点
1、构建一个原型对象
2、对其进行初始化
3、对原型对象进行克隆操作
代码示例
简单实现
<?php
/**
* PHP设计模式 原型模式(prototype)
* User: pyzn
* Date: 2016-03-22
* Time: 14:08
*/ /**
* Class Object
* 一个结构复杂的对象原型
*/
class Object
{
public function init()
{
//一些很占用系统资源的操作
} public function run()
{ } } //常规方式
$obj1 = new Object();
$obj1->init();
$obj1->run(); $obj2 = new Object();
$obj2->init();
$obj2->run(); //原型模式
$prototype = new Object();
$prototype->init(); $obj1 = clone $prototype;
$obj1->run(); $obj2 = clone $prototype;
$obj2->run();
复杂实现
/**
* PHP设计模式 原型模式(prototype)的复杂实现
* User: pyzn
* Date: 2016-03-22
* Time: 14:08
*/ /**
* Interface IPrototype
* 声明一个克隆自身的接口,对原型角色的抽象
*/
interface IPrototype
{
public function copy();
} class PrototypeObject implements IPrototype
{
private $name; public function __construct($name)
{
$this->name = $name;
} public function setName($name)
{
$this->name = $name;
} public function getName()
{
return $this->name;
} public function copy()
{
/*
* 浅copy
*/
//return clone $this; /*
* 深copy
*/
$serializeStr = serialize($this);
$cloneObj = unserialize($serializeStr); return $cloneObj;
}
} class Client
{
public static function main()
{
$prototype = new PrototypeObject("test"); $pro1 = $prototype->copy();
$pro2 = $prototype->copy(); $pro2->setName("test2"); var_dump($pro1);
var_dump($pro2);
}
} Client::main();