`
wangkechao.dream
  • 浏览: 45724 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
352630cf-f670-3416-b946-55dec5cd787c
设计模式
浏览量:29900
社区版块
存档分类
最新评论

13.设计模式之原型模式

阅读更多

原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。

原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

 

原型模式的核心是一个clone()方法,通过该方法进行对象拷贝,Java提供了一个Clonnable接口来表示这个对象是可以拷贝的。方法是覆盖clone(),此方法每个类中都有,因为它是Java中所有类的老祖宗Object中的方法。

 

在进行对象拷贝的时候,该类的构造函数并没有执行,因为Object中的clone()方法的原理是从堆内存中以二进制流的方式进行拷贝,重新分配一个内存块,所以构造函数并不会被执行

 

例子:假设有一个person类.存在两个实例张三和李四,但是因为张三和李四有些属性是相像的。所以不用通过张三这个原型来copy出一个李四的实例

 

1. person类代码

import java.util.ArrayList;
import java.util.List;

public class Person implements Cloneable{

	private String name;

	private int age;

	private char gender;

	private double height;

	private double weight;

	private ArrayList<String> readBooks = new ArrayList<String>();//读过的书

	public Person() {
		System.out.println("构造--person--开始执行.....");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public char getGender() {
		return gender;
	}

	public void setGender(char gender) {
		this.gender = gender;
	}

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	public double getWeight() {
		return weight;
	}

	public void setWeight(double weight) {
		this.weight = weight;
	}

	public List<String> getReadBooks() {
		return readBooks;
	}

	public void setReadBooks(String readBook) {
		this.readBooks.add(readBook);
	}

	public void sayHello() {
		System.out.println("my name :" + name + "--my age: " + age
				+ "--my gender: " + gender + "--读过的书:" + this.readBooks);
	}
	@Override
	public Object clone() throws CloneNotSupportedException {
		Person person = null;
		person = (Person) super.clone();
		return person;
	}
}

 

2. 运行类

public class Main {
	
	public static void main(String[] args) throws CloneNotSupportedException {
		//实例化一个张三的对象
		Person zhangsan = new Person();
		zhangsan.setName("张三");
		zhangsan.setAge(11);
		zhangsan.setGender('男');
		//通过张三复制出来一个李四的对象
		Person lisi  = (Person) zhangsan.clone();
		//修改一下名字
		lisi.setName("李四");
		//李四读过一本叫心理学的书
		lisi.setReadBooks("心理学");
		//张三的自我介绍
		zhangsan.sayHello();
		System.out.println("-----------------");
		//李四的自我介绍
		lisi.sayHello();
	}

}

 运行结果:

构造--person--开始执行.....

my name :张三--my age: 11--my gender: 男--读过的书:[心理学]

-----------------

my name :李四--my age: 11--my gender: 男--读过的书:[心理学]

 

我们分析这个结果,发现构造函数只执行了一次,但是张三本来没有读过心理学的书,但程序执行的时候

发现,张三读过的书中有这个值。原因就是克隆时的深克隆和浅克隆。上面代码是浅克隆。

将clone()方法改成如下

 

public Object clone() throws CloneNotSupportedException {
		Person person = null;
		person = (Person) super.clone();
		person.readBooks = (ArrayList<String>) this.readBooks.clone();//深度克隆
		return person;
	}

 再执行,结果如下:

 

构造--person--开始执行.....

my name :张三--my age: 11--my gender: 男--读过的书:[]

-----------------

my name :李四--my age: 11--my gender: 男--读过的书:[心理学]

 

这样就完全实现了两个对象间的隔离。

 

菜鸟,HY大神拍砖,共同进步,上次已经有大神拍了感激不尽。

 

返回导航

 

 

 

5
2
分享到:
评论
1 楼 oezx 2014-06-10  
这里readBooks数据在对象间的影响你设置了(ArrayList<String>) this.readBooks.clone()加以解决。那是否所有深度克隆需要设计的属性都需要这么设置????

相关推荐

    设计模式之原型模式

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

    【Java设计模式】《设计模式之禅》中的23种设计模式.zip

    【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种...

    设计模式之原型模式.docx

    【设计模式之原型模式】 设计模式是软件工程中的一种最佳实践,是对在特定上下文中反复出现的软件设计问题的解决方案。原型模式属于对象创建型模式,它的主要思想是通过复制已有对象来创建新对象,降低了类的实例化...

    iOS设计模式之原型模式

    本文将深入探讨一种常见的设计模式——原型模式(Prototype Pattern),并结合具体的iOS应用场景进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建...

    android设计模式之原型模式

    本文将深入探讨Android设计模式中的“原型模式”(Prototype Pattern),并结合提供的"prototype"压缩包中的示例代码进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而...

    深入理解JavaScript系列.chm

    该文档是根据博客园汤姆大叔的深入...42.设计模式之原型模式 43.设计模式之状态模式 44.设计模式之桥接模式 45.代码复用模式(避免篇) 46.代码复用模式(推荐篇) 47.对象创建模式(上篇) 48.对象创建模式(下篇)

    设计模式的原型模式的例子

    原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...

    设计模式之原型模式Java实现和类设计图

    原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...

    设计模式_源代码大全.zip

    设计模式_源代码大全.zip 包括:1.简单工厂模式 2.策略模式 3.装饰模式 4.代理模式 5.工厂方法模式 6.原型模式 7.模板方法模型 8.外观模式 9.建造者模式 10.观察者模式 11.抽象工厂模式 12.状态模式 13.适配器模式 ...

    设计模式——原型模式

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

    java设计模式之原型模式

    **Java设计模式之原型模式详解** 原型模式(Prototype Pattern)是设计模式中的一种结构型模式,主要用于快速创建对象。在Java中,它基于对象克隆的概念,允许我们复制已有对象而不必再次创建新实例,从而降低系统...

    python实现23种设计模式.设计模式python语言版

    资源中包含的"23种设计模式.jpg"可能是设计模式的图表或总结,可以帮助理解和记忆各种模式。而"python爬虫js加密解密系列文章合集-云栖社区-阿里云.url"可能是一个链接,指向有关Python爬虫中使用设计模式解决JS加密...

    《Java设计模式》课后习题参考答案-刘伟(20180723).pdf

    JDK中许多类和方法都使用了设计模式,这些模式的应用帮助实现了代码的高内聚、低耦合,提高了代码的可维护性和扩展性。下面介绍几种常见的设计模式及其在JDK中的应用实例: a) 抽象工厂模式(AbstractFactory) ...

Global site tag (gtag.js) - Google Analytics