用原型实例指定创建对象的种类,并且拷贝这些原型创建新的对象.
应用场景:

A.用new创建对象通常有较为复杂的数据准备或权限准备
B.对象较大,拷贝对象可以节省内存

UML图:

class WorkExperience
{
private $workTime;
private $workAddress; public function __construct($workTime, $workAddress)
{
$this->workTime = $workTime;
$this->workAddress = $workAddress;
} /**
* @return mixed
*/
public function getWorkTime()
{
return $this->workTime;
} /**
* @return mixed
*/
public function getWorkAddress()
{
return $this->workAddress;
} /**
* @param mixed $workTime
*/
public function setWorkTime($workTime)
{
$this->workTime = $workTime;
} /**
* @param mixed $workAddress
*/
public function setWorkAddress($workAddress)
{
$this->workAddress = $workAddress;
} } abstract class Prototype
{
protected $age;
protected $name;
protected $workExperience; public function __clone() {
$this->workExperience = clone $this->workExperience; //将对象深拷贝
}
} class Resume extends Prototype
{
public function __construct($name)
{
$this->name = $name;
} /**
* @return mixed
*/
public function getAge()
{
return $this->age;
} /**
* @param mixed $age
*/
public function setAge($age)
{
$this->age = $age;
} /**
* @return mixed
*/
public function getName()
{
return $this->name;
} /**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
} /**
* @return mixed
*/
public function getWorkExperience()
{
return $this->workExperience;
} /**
* @param mixed $workExperience
*/
public function setWorkExperience(WorkExperience $workExperience)
{
$this->workExperience = $workExperience;
}
} $workExp = new WorkExperience('2013-2015', ' A commpany'); $resumeA = new Resume("jack");
$resumeA->setAge(23);
$resumeA->setWorkExperience($workExp); $resumeB = clone $resumeA;
$workExp->setWorkTime('2016-2017');
$resumeA->setWorkExperience($workExp); echo $resumeA->getName() . PHP_EOL;
echo $resumeA->getAge() . PHP_EOL;
echo $resumeA->getWorkExperience()->getWorkTime() ;
echo $resumeA->getWorkExperience()->getWorkAddress() . PHP_EOL;
echo $resumeB->getWorkExperience()->getWorkTime() ;
echo $resumeB->getWorkExperience()->getWorkAddress() . PHP_EOL;

  

C4:原型模式 Prototype的更多相关文章

  1. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  2. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  3. 设计模式(四)原型模式Prototype(创建型)

      设计模式(四)原型模式Prototype(创建型) 1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...

  4. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  5. 原型模式-Prototype(Java实现)

    原型模式-Prototype 通过复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象. 就像去蛋糕店买蛋糕一样. 柜台里的蛋糕都是非卖品. 只是为顾客提供一种参照. 当顾客看上某一个样式的蛋糕 ...

  6. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  7. PHP设计模式 原型模式(Prototype)

    定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...

  8. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  9. 六个创建模式之原型模式(Prototype Pattern)

    定义: 使用原型实例指定创建对象的种类,并通过拷贝这个原型的属性创建新的对象. 结构图: Prototype:抽象原型类,声明克隆方法的接口,并是所有原型类的公共父类.在Java中,Object类为该 ...

随机推荐

  1. 配置sanmba

    samba是Linux系统上的一种文件共享协议,可以实现Windows系统访问Linux系统上的共享资源,现在介绍一下如何在Ubuntu 14.04上安装和配置samba 工具/原料   Ubuntu ...

  2. Linux内核实践之序列文件【转】

    转自:http://blog.csdn.net/bullbat/article/details/7407194 版权声明:本文为博主原创文章,未经博主允许不得转载. 作者:bullbat seq_fi ...

  3. 使用timeit模块 测试两种方式生成列表的所用的时间

    from timeit import Timer def test(): li=[] for i in range(10000): li.append(i) def test2(): li=[i fo ...

  4. UVA 1604:Cubic Eight-Puzzle(模拟,BFS Grade C)

    题意: 3*3方格,有一个是空的.其他的每个格子里有一个立方体.立方体最初上下白色,前后红色,左右蓝色.移动的方式为滚.给出初态空的位置,终态上面颜色情况,问最少多少步能到达.如果超过30步不能到达, ...

  5. 传输网页数据的json与xml

    #转载请留言联系 1.json json是数据格式,经常用于在网络中,不同平台或者不同语言中进行数据的传输.json的文件后缀就是 .json.当然,也可以把json直接写在js文件中. json储存 ...

  6. 腾讯微信支付,程序员是如何让jQuery代码付钱的

    微信支付和支付宝支付已经是我们生活中不可确实的两个金融软件了,也是必备的,小编认为小钱用微信,大钱用支付宝. 下面这个图是我们生活中用腾讯微信支付平台的最后一个页面,大家想不想知道这个页面是如果做出来 ...

  7. 忘记MySQL数据库密码的解决办法

    在windows下: 打开命令行窗口,停止MySQL服务: Net stop MySQL 启动mysql,一般到mysql的安装路径,找到 mysqld-nt.exe (或mysqld.exe) 执行 ...

  8. Spring:特殊数据类型的属性注入(基于配置文件)

    该处提到的特殊数据类型指的是除了基础数据类型和String以外的其他常用的数据类型,如:List.Map.Set.以及pojo对象等.则我们创建的Person类定义为: package bjtu.we ...

  9. N皇后问题(C++实现和函数式编程实现)

    题意 在 N * N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.求出有多少种合法的放置方法. C++实现(位运算 ...

  10. 洛谷——P2067 Cytus-Holyknight

    P2067 Cytus-Holyknight 题目背景 本人最初作 以此纪念伟大的ios.安卓.PSV平台音乐游戏<cytus> 后续将不断更新. -------------Chapter ...