`

设计模式学习笔记——原型模式

阅读更多

 

原型模式

利用原型模式,可以指定程序中所需的一般类,但是具体类的指定则推迟到执行期间去完成。

看上去很拗口,更多地方队原型模式的定义是:

通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。

简单的说,就是通过复制,然后适当的修改,来创建一个新的对象。

 

Java中因为有clone(),所以原型模式的实现非常简单

对于clone()来说,有几点:

1 它是一个保护方法,只能在同一个类或者子类内调用

2 只能复制那些声明为实现了Cloneable接口的对象。所有数组对象都默认实现了Cloneable接口

3 类为Object的任何对象没有实现Cloneable,会抛出CloneNotSupported的异常

综上 我们要把公用,可见的clone方法打包在类中,从而使之可以被访问。

由于clone方法返回的是一个Object对象,因此必须将它强制转换成要复制的对象类型

 

原型模式的基本实现就是基于clone()

首先,它有一个抽象类,给出了所有具体类所需要的接口等

 

public class AbstractProduct implements Cloneable{

        .....

	public Object clone() throws CloneNotSupportedException{  
        return super.clone();  
    }
}

 

然后是一个具体的原型,是对抽象类的实现,也是被clone的对象

public class ConcreteProduct extends AbstractProduct{
	......
}

最后,我们来构建我们需要的对象

 

public class Client {
	public static void main(String[] args) throws CloneNotSupportedException {
		AbstractProduct product=new ConcreteProduct();
		AbstractProduct cloneProduct=(AbstractProduct)product.clone();
	}
}

 使用原型模式的一些结论

 

在运行时,可以根据需要,以复制的方式增加和删除类

可以基于程序条件,在运行时修改一个类的内部数据表示

还可以在运行时指定新的对象,而无需创建一系列类和继承结构

拷贝原型类的思想以为着可以充分访问这些类中的数据或方法,从而在复制之后将其加以修改。这可能要求向某些原型类增加数据访问方法,一遍复制了类后可以修改数据。

 

 

讨论完基础的原型模式,还有一些必要的补充(这里的概念copy了某日志 我在最后贴了链接 希望原作者不要介意)

首先,是对于clone方法,clone方法在Java中实现的浅拷贝

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象,换言之, 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝

被复制对象的所有的变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将 指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了 一遍,而这种对被引用到的对象的复制叫做间接复制。 

 

要实现深拷贝,就提到了串行化,有一种技巧,称作“hack(出租)”。

把一个类写作为一个字节流,并且将那些字节再读回来重新构造该类,就是串行化。这里要使用到Serializable接口,同Cloneable类似,他们不含任何方法,只是一个标示声明。

public class deepClone{
	public Object deepClone() throws IOException, ClassNotFoundException{ 
	//将对象写到流里 
	ByteArrayOutputStream bo = new ByteArrayOutputStream(); 
	ObjectOutputStream oo = new ObjectOutputStream(bo); 
	oo.writeObject(this); 
	//从流里读回来 
	ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); 
	ObjectInputStream oi = new ObjectInputStream(bi); 
	return (oi.readObject()); 
	}
}

 最后,原型模式同单例模式一样,也有注册表管理式的,实现的原理相似,构造一张表,在复制时进行查找。

 

关于原型模式,有一些内容来自

http://www.iteye.com/topic/503040

还有一个关于创建型设计模式的博客

http://icyfenix.iteye.com/blog/575049

对星际争霸熟悉的 看起来会很有思路 非常不错

 

另外 关于Java中clone的问题

http://www.iteye.com/topic/483469

给出了一定的研究 可以看看

 

到此为止 所有的创建型设计模式笔记结束了,一些tips来的小结

工厂模式:根据提供给该工厂的数据,选择并返回多个相似类中某个类的一个实例

抽象工厂模式:返回多组类中的一组。在有些情况下,它实际上返回的是该组类的一个工厂模式

生成器模式:根据所提供的数据,将多个对象组合以得到一个新的对象。通常使用一个工厂模式选择组合对象的方式

原型模式:当创建新的实例代价更大时,可采用拷贝或者复制一个现有类的方法,而不是创建一个新的实例。

单例模式:确保一个对象有且只有一个实例,并且可以获取该实例的一个全局访问点

 

分享到:
评论

相关推荐

    系统分析与设计——课程笔记.rar

    系统分析与设计是软件开发过程中的关键阶段,它涉及到对现有系统的理解、需求的收集与分析、系统的规划以及设计。本课程笔记主要涵盖了这一领域的...这份“系统分析与设计——课程笔记”将是你探索这一领域的宝贵资源。

    软件设计师软考笔记.zip

    这份压缩包包含了博主在学习过程中记录的详细笔记,以及一份精心整理的设计模式表格,旨在帮助备考者系统、高效地掌握相关知识。 首先,我们来探讨一下“软考”——这是一项国家级的专业技术资格认证考试,旨在评测...

    学习笔记 MHT2

    【学习笔记 MHT2】是一份综合性的IT学习资料,主要涵盖了JavaScript编程、软件开发工具、Web服务器技术、编码解码方法以及设计模式等多个领域的知识。以下是对这些知识点的详细阐述: 1. **JavaScript经典技巧**:...

    SSM模式学习路线-----[Spring入门笔记](csdn)————程序.pdf

    【Spring入门笔记】主要介绍了Spring框架的基础知识,包括Spring的核心概念、Bean的配置与作用域、依赖注入、SpringAop和SpringJdbc,以及事务声明。以下是对这些知识点的详细说明: 1. **什么是Spring?** Spring...

    msp430资料——很全的

    这个“msp430资料——很全的”压缩包文件,显然是为学习和开发MSP430微控制器提供的一系列资源集合,可能包含了MSP430的基础知识、编程指南、应用实例、开发工具以及驱动程序等。 首先,我们来深入了解MSP430的主要...

    tristan-working-notes-dendron:Tristan Williams工作说明的公开副本

    《特里斯坦·威廉姆斯工作笔记——Dendron公开副本》 这是一份由特里斯坦·威廉姆斯(Tristan Williams)编撰的工作笔记,以Dendron这款强大的知识管理工具为载体。Dendron是一个开源的、基于文本的、可扩展的笔记...

    初中语文文摘社会“梦想”可以成真

    1. **灵感与创新**:在编程和软件开发中,解决问题的新方法、设计模式的创新或应用程序的全新概念可能源于开发者在非正式的思考状态下,如休息或梦境中产生的想法。例如,一个复杂的算法可能在放松的状态下突然变得...

    资源里包含tensorflow的介绍,及其简单式样demo源码,供大家学习参考

    这个框架的设计目标是让数据流图的构建、评估和部署变得简单,广泛应用于机器学习(Machine Learning)和人工智能(AI)领域。它的名字“TensorFlow”来源于其核心概念——张量(Tensor),即多维数组,是处理和建模...

    Dive-into-DL-TensorFlow2.0-master.zip

    此外,Keras API在TensorFlow2.0中被提升为核心部分,使得模型构建更加简洁高效,特别适合快速原型设计和实验。 本书将引导读者从基础概念开始,逐步掌握张量操作、变量、会话(Session在TF2.0中已被弃用)、控制流...

    车牌识别开发

    EasyPR最初是基于CSDN博客上的一篇读书笔记,该笔记描述了如何利用开源的机器学习库,基于一本书中介绍的车牌识别技术来构建一个车牌系统的雏形。这个系统最初是针对西班牙的车牌设计的,因此系统训练所使用的模型也...

    LCD.rar_xgate lcd

    描述中提到,“飞思卡尔HCS12单片机LCD调试程序,适合飞思卡尔单片机初学者使用”,这表明这个程序是专为学习和调试HCS12单片机上的LCD显示功能设计的。HCS12是一款基于Motorola 16位MC68HC12内核的微控制器,广泛...

    GD32全系列硬件开发指南_gd32所有系列_GD32_GD32开发_硬件_硬件开发指南

    通过《GD32全系列硬件开发指南》,开发者可以学习到GD32系列的选型、硬件设计、软件编程以及系统级应用等多方面知识,从而有效地进行GD32相关项目的开发。这份指南是GD32开发者不可或缺的参考资料。

    TwinCAT3_C _Simulink教程V3.1,twincat3仿真运行

    《TwinCAT3_C++_Simulink教程V3.1——实现自动化工程的高效集成》 在自动化工程领域,TwinCAT3以其强大的实时控制和编程能力深受工程师喜爱。结合C++编程语言和MATLAB Simulink的可视化建模,可以实现复杂系统的...

    5529和x600_msp430_

    X600开发板可能提供了MSP430F5529的评估和实验平台,帮助开发者快速进行原型设计和系统验证。 **MSP430F5529关键特性:** 1. **低功耗**:MSP430系列以其极低的运行和待机功耗而闻名,适用于电池供电或能量采集的...

    Readable and Writable worDbook-开源

    《可读写词汇簿——开源软件的创新学习工具》 在信息技术日新月异的今天,开源软件已经成为了推动技术创新的重要力量。其中,“Readable and Writable worDbook”(RWD)是一个专为语言学习者设计的独特工具,它...

    2021-02-26 stm32h471-disco.7z

    "2021-02-26 stm32h471-disco.7z"文件可能包含了一个基于STM32H471的开发板——STM32H471 Disco的资料和开发资源。 STM32H7系列是基于ARM Cortex-M7内核的微控制器,具有高速浮点运算能力,最高主频可达480MHz,...

    arduino按键控双色接线

    综上所述,“Arduino按键控双色接线”不仅是一项基础的电子实验项目,同时也是学习Arduino编程和基本电路设计的良好起点。通过实践本实验,不仅可以掌握基本的硬件连接方法,还能进一步理解Arduino的编程逻辑及按键...

    Kaggle:适用于kaggle比赛的Jupyter笔记本

    这对于实验性工作和快速原型设计非常有用。 在Kaggle比赛中,通常涉及以下几个步骤: 1. **数据加载与预处理**:使用Pandas库读取数据集,如CSV文件,然后进行初步的数据清洗,包括处理缺失值、异常值和重复值。...

    自己动手写操作系统(含源代码).part2

    Woodhull的《操作系统:设计与实现》来学习操作系统的读者,本书尤其适合作为你的引路书籍,因为它翔实地介绍了初学者入门时所必需的知识积累,而这些知识在《操作系统:设计与实现》一书中是没有涉及的,笔者本人...

Global site tag (gtag.js) - Google Analytics