C4:原型模式 Prototype
用原型实例指定创建对象的种类,并且拷贝这些原型创建新的对象.
应用场景:
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的更多相关文章
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
- 二十四种设计模式:原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
- 设计模式(四)原型模式Prototype(创建型)
设计模式(四)原型模式Prototype(创建型) 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- 原型模式-Prototype(Java实现)
原型模式-Prototype 通过复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象. 就像去蛋糕店买蛋糕一样. 柜台里的蛋糕都是非卖品. 只是为顾客提供一种参照. 当顾客看上某一个样式的蛋糕 ...
- 原型模式 prototype 创建型 设计模式(七)
原型模式 prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象 显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...
- PHP设计模式 原型模式(Prototype)
定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...
- 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 六个创建模式之原型模式(Prototype Pattern)
定义: 使用原型实例指定创建对象的种类,并通过拷贝这个原型的属性创建新的对象. 结构图: Prototype:抽象原型类,声明克隆方法的接口,并是所有原型类的公共父类.在Java中,Object类为该 ...
随机推荐
- CANO入门(三)
最好的学习方式是什么?模仿.有人会问,那不是山寨么?但是我认为,那是模仿的初级阶段,当把别人最好的设计已经融化到自己的血液里,变成自己的东西,而灵活运用的时候,才是真正高级阶段.正所谓画虎画皮难画骨. ...
- C语言.c和.h
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成 ...
- 汕头市队赛 SRM 09 A 撕书
A 撕书I-3 SRM 09 背景&&描述 琉璃在撕书. 书总共有n页,都悬浮在数轴上,第i页的位置为,上面写着一个数字. 琉璃从右往左撕书.假如看到了第i页,就把在第 ...
- ListView控件的不为人知的秘密
使用ListView控件展示数据 1.图像列表控件(ImageList控件) 图像列表控件(ImageList控件)是含有图像对象的集合,可以通过索引或关键字引用该集合的每个对象,ImageList控 ...
- NOIP2011提高组
D1T1.铺地毯 for循环 #include<iostream> #include<cstdio> #include<algorithm> using names ...
- QT5.3.1 Quick 开发 --- 项目类型的选择(转)
原文转自 https://www.cnblogs.com/aoldman/p/3966025.html 作为一个转行QT开发的新手,面对基于QML的开发时候 看到很多的项目类型感到很困惑,不知道应该怎 ...
- Gson解析json数据的案例一
转自:http://blog.csdn.net/l331258747/article/details/51547338: Android利用Gson解析嵌套多层的Json 首先先讲一个比较简单点的例子 ...
- HTML,DIV+CSS,js,JQ,UI-WEB前端设计经验
目前比较全的CSS重设(reset)方法总结 在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览 ...
- laravel按月/时间区间查询数据
public function payRollList($time) { $member_phone = Session::get(phone'); $engineer = Engineer::get ...
- 关于Date数据类型格式化的转换
例如: jsp页面读取数据库中日期格式的列时可能显示为1988-05-03 00:00:00 格式,但是我们不想要后面的00:00:00时间,只想要前面的年月日,那么该如何做出修改呢? 方法一:我 ...