设计模式(4)-对象创建型模式-Prototype模式
1.对象创建型模式
1.4 Protoype模式
1.4.1需求
通过拷贝原形对象创建新的对象。
1.4.2结构
•P r o t o t y p e(Gr a p h i c)
— 声明一个克隆自身的接口。
•C o n c r e t e P r o t o t y p e(S t a ff、W h o l e N o t e、H a l fN o t e)
— 实现一个克隆自身的操作。
• C l i e n t(G r a p h i c To o l)
— 让一个原型克隆自身从而创建一个新的对象。
1.4.3样例-C++
//Prototype.h
#ifndef _PROTOTYPE_H_
#define _PROTOTYPE_H_
class Prototype
{
public:
virtual ~Prototype();
virtual Prototype*Clone()const = 0;
protected:
Prototype();
private:
};
class ConcretePrototype:public Prototype
{
public:
ConcretePrototype();
ConcretePrototype(const ConcretePrototype& cp);
~ConcretePrototype();
Prototype* Clone() const;
protected:
private:
};
#endif //~_PROTOTYPE_H_
代码片断2:Prototype.cpp
//Prototype.cpp
#include"Prototype.h"
#include<iostream>
using namespace std;
Prototype::Prototype()
{
}
Prototype::~Prototype()
{
}
Prototype* Prototype::Clone() const
{
return 0;
}
ConcretePrototype::ConcretePrototype()
{
}
ConcretePrototype::~ConcretePrototype()
{
}
ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp)
{
cout<<"ConcretePrototype copy..."<<endl;
}
Prototype* ConcretePrototype::Clone() const
{
return newConcretePrototype(*this);
}
//main.cpp
#include"Prototype.h"
#include<iostream>
using namespace std;
int main(int argc,char*argv[])
{
Prototype* p= newConcretePrototype();
Prototype* p1=p->Clone();
return 0;
}
注:这里仅仅是说明概念,没有涉及C++常见的深度拷贝问题.
1.4.4 样例-JAVA
在Java中,原型模式能够非常easy地实现,仅仅要实现Cloneable这个标识性的接口,再覆盖该接口中的clone()方法,就可以“克隆”该实现类的不论什么一个对象。
class ConcretePrototype02 implements Cloneable{
private String name;
private ArrayList<String> nameList = new ArrayList<String>();
public ConcretePrototype02(String name) {
this.name = name;
this.nameList.add(this.name);
}
//加入nameList中的对象
public void setName(String name) {
this.nameList.add(name);
}
public ArrayList<String> getNameList() {
return this.nameList;
}
//覆盖Object基类中的clone()方法,并扩大该方法的訪问权限,详细化返回本类型
public ConcretePrototype02 clone() {
ConcretePrototype02self = null;
try {
self= (ConcretePrototype02) super.clone();
//下面这句是实现深拷贝的关键
// self.nameList =(ArrayList<String>) this.nameList.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return self;
}
}
//測试类
public class Client {
public static void main(String[] args) {
ConcretePrototype02prototype02 = new ConcretePrototype02("蚂蚁 ...");
System.out.println(prototype02.getNameList());
//通过clone获得一个拷贝
ConcretePrototype02fromClone02 = prototype02.clone();
fromClone02.setName("小蚂蚁 ...");
System.out.println(fromClone02.getNameList());
System.out.println(prototype02.getNameList());
}
}
測试结果:
|
拷贝之前的原型: [蚂蚁 ...] 拷贝得到的对象: [蚂蚁 ..., 小蚂蚁 ...] 拷贝之后的原型: [蚂蚁 ..., 小蚂蚁 ...] |
发现拷贝之后原来的对象持有的ArrayList<String>类型的nameList引用会随着拷贝得到的fromClone对象运行了setName()方法而改变。这不是我们想要的结果,由于这意味着原型以及拷贝得到的对象共享同一个引用变量,这是线程不安全的。当我们去掉
上面clone()方法中被凝视的语句之后再測试,得到结果例如以下:
|
拷贝之前的原型: [蚂蚁 ...] 拷贝得到的对象: [蚂蚁 ..., 小蚂蚁 ...] 拷贝之后的原型: [蚂蚁 ...] |
在Java中使用原型模式Prototype是相当简单的,仅仅要记住几点注意点,就能够方便地实现该模式了。
因为使用clone()方法来拷贝一个对象是从内存二进制流中进行IO读写。所以拷贝得到一个对象是不会运行该对象所相应类的构造函数的。
总结例如以下:
1、构造函数不会被运行。
2、类的成员变量中若有引用类型的变量(数组也是一种对象)。默认的clone()并不会对其进行拷贝,需自行提供深拷贝;
设计模式(4)-对象创建型模式-Prototype模式的更多相关文章
- 设计模式(3)-对象创建型模式-Abstract Factory模式
1.对象创建型模式 1.3 Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: • 一个系统要独立于它的产品的创建. ...
- JAVA设计模式 2【创建型】原型模式的理解与使用
在本节中,我们将学习和使用原型模式:这一节学习的原型模式也是创建型 模式的其中之一.再次复习一下:创建型 模式就是描述如何去更好的创建一个对象. 我们都知道,在JAVA 语言中.使用new 关键字创建 ...
- 【创建型】Prototype模式
原型模式主要是用原型实例指定创建原型对象的种类,并且通过拷贝原型创建新对象.最简单的理解就是克隆.就如cocos2d-x中的 class Clonable::clone();该模式的主要目的是可以在运 ...
- Java经典设计模式之五大创建型模式
转载: Java经典设计模式之五大创建型模式 一.概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种: ...
- [C#]设计模式-抽象工厂-创建型模式
介绍了简单工厂与工厂方法之后,现在我们来看一下工厂三兄弟的最后一个 -- 抽象工厂. 那什么是抽象工厂呢? 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相 ...
- Java设计模式——单例模式(创建型模式)
概述 单例模式保证对于每一个类加载器,一个类仅有一个实例并且提供全局的访问.其是一种对象创建型模式.对于单例模式主要适用以下几个场景: 系统只需要一个实例对象,如提供一个唯一的序列号生成器 客户调 ...
- php开发面试题---创建型设计模式1(创建型设计模式有哪几种)
php开发面试题---创建型设计模式1(创建型设计模式有哪几种) 一.总结 一句话总结: 共五种:(简单工厂模式).工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 1.学设计模式最好的方 ...
- ProtoType(原型)-对象创建型模式
1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者“克隆”一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使 ...
- NET设计模式 第二部分 创建型模式(5):原型模式(Prototype Pattern)
原型模式(Prototype Pattern) ——.NET设计模式系列之六 Terrylee,2006年1月 概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构.这 ...
随机推荐
- Cubieboard4卡片式电脑
Cubieboard4 also named CC-A80, is a open source mini PC or single board computer which has ultra-pow ...
- UVA10006 - Carmichael Numbers
题目链接:UVA10006 本来想直接打素数表,然后根据素数表来判断,结果一直超时,后来把素数表去掉,再在for循环中加判断才勉强过了. Some numbers that are not prime ...
- [Boost基础]并发编程——asio网络库——同步socket处理
网络通信简述 asio库支持TCP,UDP和ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好的封装了原始的Berkeley Socket API, ...
- java运行脚本语言demo
public class Test { /** * @param args * @throws IOException */ public static void main(String[] arg ...
- shell程序设计(转)
1.shell脚本的基本概念: (1)Shell执行的是称为shell程序,这些程序通常被称为脚本. (2)Shell是一个用户和系统间接口的程序,它允许用户向操作系统输入需要执行的命令. (3)sh ...
- Hadoop 2.x从零基础到挑战百万年薪第一季
鉴于目前大数据Hadoop 2.x被企业广泛使用,在实际的企业项目中需要更加深入的灵活运用,并且Hadoop 2.x是大数据平台处理 的框架的基石,尤其在海量数据的存储HDFS.分布式资源管理和任务调 ...
- [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现
Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...
- Streaming编程实例(c,c++,python等)
1.概述 Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如: 采用shell脚本语言中的一些命令作为ma ...
- [置顶] java Gui 键盘监听事件
简单写一个java Gui键盘监听事件,实现的效果就是按下键盘控制台输出你按下的键.比如:按下A控制台就输出A 效果如图: 以下把实现的效果分为几个步骤: 1.新建一个窗体类继承窗体: 2.给这个窗体 ...
- readline-6.3 之arm平台交叉编译
近期须要弄个CLI命令接口程序,初步设想是须要支持历史命令翻阅,tab键命令补全这种一个东西.经查阅相关文档,深耕百度一番!(google近期不太正常) 实在恼火.发现readline果真是个好东西, ...