`
zzq19860626
  • 浏览: 264481 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
B20df9e2-fb3d-3644-9f72-c1619842f682
设计模式学习笔记
浏览量:180035
87eaf24f-812a-3463-8e65-e3197d2ad8c2
java虚拟机
浏览量:26623
社区版块
存档分类
最新评论

JAVA设计模式学习9——原型模式

阅读更多

原型模式(prototype)它是指通过给定一个原型对象来指明所要创建的对象类型,然后复制这个原型对象的办法创建出同类型的对象。原型模式也属于创建模式。

我们先来看一下原型模式的模型:

原型模型涉及到三个角色:

客户角色(client):客户端提出创建对象的请求;

抽象原型(prototype):这个往往由接口或者抽象类来担任,给出具体原型类的接口;

具体原型(Concrete prototype):实现抽象原型,是被复制的对象;

模拟代码如下:

 

package prototype;
/**
 * 
 *作者:alaric
 *时间:2013-7-18下午10:40:49
 *描述:抽象接口
 */
public interface Prototype extends Cloneable {

	public Object clone();
	
}

 

package prototype;
/**
 * 
 *作者:alaric
 *时间:2013-7-18下午10:41:39
 *描述:实现接口
 */
public class ConcretePrototype implements Prototype {

	@Override
	public Object clone() {
		try {
			return  super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	}	

}

 

 

package prototype;
/**
 * 
 *作者:alaric
 *时间:2013-7-18下午10:41:14
 *描述:客户端
 */
public class Client {
	private Prototype prototype;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Client c = new Client();
		c.prototype = c.getNewPrototype(new ConcretePrototype());

	}
	/**
	 * 
	 * @param prototype
	 * @return
	 */
    public Prototype getNewPrototype(Prototype prototype){
    	return (Prototype) prototype.clone();
    }
}

 以上代码简单描述了原型模式的实现,说到这里估计很多人要跳了,因为说到原型模式不能不说的问题是java的深拷贝和浅拷贝,那下面我们就来讨论下深拷贝和浅拷贝。

浅拷贝:是指拷贝引用,实际内容并没有复制,改变后者等于改变前者。

深拷贝:拷贝出来的东西和被拷贝者完全独立,相互没有影响。

引用一哥们举的例子(博客地址忘记了)

有一个人叫张三,人们给他取个别命叫李四,不管张三还是李四都是一个人,张三胳膊疼,李四也是一个样的不爽。这个就是浅拷贝,只是个别名而已。

同样还是有一个人叫张三,通过人体克隆技术(如果法律允许)得到一个李四,这个李四和被克隆的张三完全是两个人,张三就是少个胳膊,李四也不会感到疼痛。这个就是深拷贝。

 

java语言提供Cloneable接口,在运行时通知虚拟机可以安全的在这个类上使用clone()方法,通过这个方法可以复制一个对象,但是Object并没有实现这个接口,所以在拷贝是必须实现此标识接口,否则会抛出CloneNotSupportedException。

但是clone()方法出来的默认都是浅拷贝,如果要深拷贝,那么可以考虑自己编写clone方法,但是深度很难控制,编写这个clone方法也不是最佳方案,还有个比较好的方案就是串行化来实现,代码如下:

public Object deepClone(){
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(bos); 
    oos.writeObject(this); 
    ByteArrayInputStream bis = new ByteArrayInputStream(baos.toByteArray()) 
    ObjectInputStream ois = new ObjectInputStream(bis); 
    return ois.readObject();
}

这样就可以实现深拷贝,前提是对象实现java.io.Serializable接口。

 

注意:除了基本数据类型外,其他对象默认拷贝都是浅拷贝,String类型是个例外,虽然是基本类型,但是也是浅拷贝,这个跟它实际在java内存存储情况有关。超出了设计模式讨论范围,大家可自行查看相关资料。

 

 

 

设计模式系列目录:

JAVA设计模式学习1——统一建模语言UML

JAVA设计模式学习2——面向对象设计原则

JAVA设计模式学习3——设计模式概述

JAVA设计模式学习4——简单工厂模式

JAVA设计模式学习5——工厂方法模式

JAVA设计模式学习6——抽象工厂模式

JAVA设计模式学习7——单例模式

JAVA设计模式学习8——建造模式

JAVA设计模式学习9——原型模式

JAVA设计模式学习10——组合模式

JAVA设计模式学习11——适配器模式

JAVA设计模式学习12——装饰器模式

JAVA设计模式学习13——代理模式

JAVA设计模式学习14——享元模式

JAVA设计模式学习15——门面模式

JAVA设计模式学习16——桥梁模式

JAVA设计模式学习17——策略模式

JAVA设计模式学习18——模版方法模式

JAVA设计模式学习19——观察者模式

JAVA设计模式学习20——责任链模式

JAVA设计模式学习21——命令模式

JAVA设计模式学习22——备忘录模式

JAVA设计模式学习23——状态模式

JAVA设计模式学习24——访问者模式

JAVA设计模式学习25——迭代器模式

  • 大小: 8.3 KB
4
2
分享到:
评论
6 楼 zzq19860626 2013-11-21  
lee_govern 写道
“浅拷贝:是指拷贝引用,实际内容并没有复制,改变后者等于改变前者。”
我觉得博主对浅克隆的描述有点不准确,如果拷贝只含有基本类型的对象,浅克隆是完全满足复制的定义的,拷贝的对象跟原对象引用并不相同,两者互相独立,改变其一不会对另一对象造成影响。

你说的对,不知道你注意我文章最后一句话了没有,那个注意写的应该就是你想说的。
5 楼 lee_govern 2013-11-19  
“浅拷贝:是指拷贝引用,实际内容并没有复制,改变后者等于改变前者。”
我觉得博主对浅克隆的描述有点不准确,如果拷贝只含有基本类型的对象,浅克隆是完全满足复制的定义的,拷贝的对象跟原对象引用并不相同,两者互相独立,改变其一不会对另一对象造成影响。
4 楼 zzq19860626 2013-09-19  
QuarterLifeForJava 写道
有几个问题请教下博主:
1、浅克隆中:Cloneable是一个标记接口,你是Prototype extends Cloneable ,然后ConcretePrototype implements Prototype ,这里不大理解,需要这么麻烦吗?直接implements Cloneable ,然后重写clone()方法不就可以了吗?
2、重写clone()方法,这样写是不是更好一点呢?
try{
      return super.clone();
}catch(CloneNotSupportedException e){
      return null;
}

3、如1所述,这么写的话,应该是面向接口编程的思想吧,那么我看到书中,似乎还有个容器来管理克隆对象

public class PrototypeManager {

	//采用容器管理
	private Vector<Prototype> objects = new Vector<Prototype>();
	
	//增加一个新的对象
	public void add(Prototype object){
		objects.add(object);
	}
	
	//取出一个对象
	public Prototype get(int i){
		return (Prototype) objects.get(i);
	}
	
	//给出容器的大小
	public int getSize(){
		return objects.size();
	}
}


你的问题都很好, 对于你的第一点一问:原型模式给定一个原型对象来指明所要创建的对象类型,然后复制这个原型对象的办法创建出同类型的对象。说的是已有对象克隆出新对象。然而java中实现Cloneable只是一种办法,多加了一个接口是广义的,意思是模式不限于语言和实现的形式, 也就是说实际开发中也可以不实现这个接口;第二点:我这里代码是多余的,看来你认真看了,现在已经改了;第三点,说的也很好 实际使用过程中都会配合池的技术或者是享元模式来对已经克隆好的对象进行管理。
3 楼 QuarterLifeForJava 2013-09-16  
有几个问题请教下博主:
1、浅克隆中:Cloneable是一个标记接口,你是Prototype extends Cloneable ,然后ConcretePrototype implements Prototype ,这里不大理解,需要这么麻烦吗?直接implements Cloneable ,然后重写clone()方法不就可以了吗?
2、重写clone()方法,这样写是不是更好一点呢?
try{
      return super.clone();
}catch(CloneNotSupportedException e){
      return null;
}

3、如1所述,这么写的话,应该是面向接口编程的思想吧,那么我看到书中,似乎还有个容器来管理克隆对象

public class PrototypeManager {

	//采用容器管理
	private Vector<Prototype> objects = new Vector<Prototype>();
	
	//增加一个新的对象
	public void add(Prototype object){
		objects.add(object);
	}
	
	//取出一个对象
	public Prototype get(int i){
		return (Prototype) objects.get(i);
	}
	
	//给出容器的大小
	public int getSize(){
		return objects.size();
	}
}
2 楼 zzq19860626 2013-07-19  
wuchsh2013 写道
比起那些翻译外国些的,通俗易懂。好文章。

谢谢~~
1 楼 wuchsh2013 2013-07-19  
比起那些翻译外国些的,通俗易懂。好文章。

相关推荐

    设计模式——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    Java设计模式——原型模式

    Java设计模式——原型模式 原型模式Java设计模式——原型模式概念使用场景Java里的克隆代码理解prototype(原型)问题总结优缺点模型优点模型缺点 概念 ​ 原型模式是创建型模式的最后一种,讲到原型模式就不得不提到...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    Java设计模式精讲1

    总结来说,Java设计模式的学习是一条不断深化的过程,它从UML开始,到设计模式的具体分类和应用,再到软件设计原则的领悟,每一步都是提升个人技术能力的重要环节。通过不断的学习和实践,开发者能够成为一名更加...

    Java 23种设计模式08原型模式.pdf

    ### Java设计模式之原型模式深度解析 #### 模式动机 在面向对象编程的世界里,对象的创建往往伴随着复杂的逻辑处理。特别是在某些场景下,对象的构造过程可能涉及大量资源的消耗,例如数据库连接、文件读写等。在...

    java设计模式(23种设计模式大全)

    根据提供的标题、描述以及部分内容,本文将深入探讨Java设计模式,并着重分析23种常见的设计模式,以帮助Java程序员更好地理解和应用这些模式。 ### Java设计模式概述 Java设计模式是面向对象软件设计的一种通用可...

    Java与模式(闫宏)

    《Java与模式》是闫宏大师的一部经典之作,它将古老的哲学智慧——道德经的智慧,巧妙地融入到现代编程语言Java的设计模式之中。这本书不仅深入浅出地讲解了23种经典的设计模式,还提供了丰富的实践案例,旨在帮助...

    java设计模式(1)

    ### Java设计模式(1)——理解与应用 #### 一、设计模式概述 设计模式是在软件工程领域中,为了应对特定问题或情境而形成的最佳实践集合。这些模式可以帮助开发者更高效地解决常见问题,提高代码的可重用性和可...

    设计模式之原型模式

    **原型模式(Prototype Pattern)**是软件设计模式中的结构型模式之一,主要用来简化实例化过程,减少类的创建。在原型模式中,一个对象可以被用作创建其他新对象的模板,通过复制已有对象来创建新对象,而不是通过new...

    设计模式——JAVA.docx

    ### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...

    java的设计模式 《设计模式-java语言中的应用.pdf》

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板或蓝图。...通过阅读《设计模式——Java语言中的应用》这本书,你可以更深入地学习和掌握这些模式的细节及其在实际开发中的应用。

    JAVA设计模式(中文).chm

    《JAVA设计模式(中文).chm》是一部专为Java开发者准备的设计模式指南,它深入浅出地阐述了软件工程中的重要概念——设计模式。设计模式是解决常见编程问题的成熟解决方案,是经验丰富的开发者们在实践中总结出的最佳...

    Java和Android源码设计模式

    #### 前言:迈向精通之路——设计模式的重要性 在软件开发领域,设计模式被视为提升代码质量和可维护性的关键工具。本文将深入探讨Java和Android开发中常用的设计模式,并结合实际案例进行解析,帮助读者理解和应用...

    java设计模式+算法

    "Java设计模式-图解-附代码"可能会通过图形化的方式,帮助读者直观理解各种设计模式,并提供了具体的Java代码示例,这对于初学者来说尤其有帮助。书中可能涵盖了23种经典设计模式,如工厂模式、建造者模式、原型模式...

    JAVA设计模式--入门

    **Java设计模式——入门** 设计模式是软件开发中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。Java设计模式是面向对象编程中的一个重要概念,可以帮助开发者编写可复用、可维护、易于理解的代码。这...

    Java设计模式经典搞笑珍藏版

    通过《Java设计模式经典搞笑珍藏版》,读者不仅可以学习到设计模式的基本原理和实现方式,还能通过生动的例子加深理解。设计模式是软件开发中非常重要的一部分,掌握了这些模式可以帮助开发者写出更高效、更易维护的...

Global site tag (gtag.js) - Google Analytics