"围观"设计模式(10)--创建型之原型模式(Prototype Pattern)

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

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

首先看下面这样的一个例子,使用本人自黑一下,实现Clonable接口然后实现它的clone的方法,然后通过该方法对这个对象进行克隆。看是不是像我们期待的那样会创建出新的对象。

public class WangYang implements Cloneable{

	private String name;

	private String address;

	public String getName() {
		return name;
	}

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

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	@Override
	protected WangYang clone() {
		WangYang wy = null;
		try {
			wy = (WangYang) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return wy;
	}

	@Override
	public String toString() {
		return "WangYang [name=" + name + ", address=" + address + "]";
	}

}

对上面的程序进行测试的测试类:

public static void main(String[] args) {
		WangYang wy = new WangYang();
		wy.setAddress("SH");
		wy.setName("wy");

		WangYang wangyang = wy.clone();

		System.out.println(wangyang == wy);
		System.out.println(wangyang);
	}

输出的结果为:

从这里可以看出wangyang对象和wy这个对象不是同一个对象,重新创建了新的对象。

但是稍微改一下,我有件衣服,衣服有颜色的属性,那么之前的WangYang类要增加一个属性那就是衣服的对象

private String name;

private String address;

private Clothes cloth;

更改完毕再次运行main测试程序,结果发现并没有对cloth进行拷贝

System.out.println(wangyang.getCloth() == wy.getCloth());

输出的结果为:true

接下来再改一下,多件衣服。

private String name;

private String address;

private Clothes cloth;

private ArrayList<Clothes> clothesList = new ArrayList<Clothes>();

和上面的类似,在测试类中进行测试

System.out.println(wangyang == wy);
System.out.println(wangyang.getClothesList() == wy.getClothesList());
System.out.println(wangyang.getCloth() == wy.getCloth());
System.out.println(wangyang);

输出的结果

看中间这两个true表示,wy对象中的cloth和clothesList没有拷贝,直接引用的原来的对象。这个地方就是浅拷贝。主要拷贝基本数据类型和String的。

那么怎么让其进行深拷贝。

对WangYang类中的clone方法进行改造,显式的去clone其内部的对象。

// 深拷贝
		WangYang wy = null;
		try {
			wy = (WangYang) super.clone();
			cloth = this.cloth.clone();
			clothesList = (ArrayList<Clothes>) this.clothesList.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return wy;

这个地方要想让cloth对象也可以进行clone,那么需要让Clothes这个类同时实现Clonable接口实现clone方法。

此时的测试结果如何:

System.out.println(wangyang == wy);
System.out.println(wangyang.getClothesList() == wy.getClothesList());
System.out.println(wangyang.getCloth() == wy.getCloth());
System.out.println(wangyang);

如图:

中间的两行全部是false了。这说明进行了深拷贝。

原型模式的优点

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

注意:

1. 原型模式创建对象不会调用构造函数进行创建。直接从内存去赋值对象的数据,忽略构造函数的限制,他和之前提到的单例模式有所冲突,单例模式会将构造函数设置为私有,而原型模式却可以绕过构造函数去通过内存中的对象的数据区创建对象,所以这个地方就会有所冲突。

2. 注意深拷贝和浅拷贝。对于数组、容器对象、对象等可能需要进行深拷贝。

设计模式系列代码下载地址:设计模式系列代码下载

时间: 2024-10-10 22:19:05

"围观"设计模式(10)--创建型之原型模式(Prototype Pattern)的相关文章

设计模式(创建型)之原型模式(Prototype Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! 概述 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过

&quot;围观&quot;设计模式(9)--创建型之创建者模式(Builder Pattern)

生成器模式(英:Builder Pattern)是一种设计模式,又名:建造模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象.----WIKIPEDIA 个人的理解: 建造者模式可以设置不同的属性或者行为,创建出不一样的对象.比如说生产汽车,假如有三个重要的工序,塑形.拼装.上色.那么可以通过创建者模式来设置,这三道工序中不同的车来说,三道工序可能就是不一样的.通过创建者模式来创建出对象的表现形式也自然就不一样.

&quot;围观&quot;设计模式(29)--创建型设计模式总结(单例、工厂、原型、创建者)

设计模式源码下载地址 设计模式源码下载地址 1  单例模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息.这种方式简化了在复杂环境下的配置管理.----维基百科(WIKIPEDIA) 个人的理解: 单例模式概

&quot;围观&quot;设计模式(19)--行为型之观察者模式(Observer Pattern)

观察者模式是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实时事件处理系统.----WIKIPEDIA 个人理解 观察者模式,就是使得被观察者中持有观察者的对象实例,在发生某些事件的时候,通过notify"通知"观察者,完成相应的操作,他也叫作发布-订阅模式,定义对象间一对多的依赖关系,使得被观察者对象产生动作,即可通知其依赖的对象该被观察者发生了变更. 案例

二十四种设计模式:原型模式(Prototype Pattern)

原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 示例有一个Message实体类,现在要克隆它. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Prototype { /// <summary> /// Message实体类 /// </summary> publi

&quot;围观&quot;设计模式(18)--行为型之模板方法模式(TemplateMethod Pattern)

模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤.----WIKIPEDIA 个人理解 模板方法模式相对而言比较简单,一般的都是由抽象类定义好模板方法,然后,子类通过继承并实现其父类中定义好的模板中需要执行的具体的方法,调用子类对象的模板方法时,会执行该类中的具体实现的方法.这个模式我个人的感觉有点像是面向过程的操作,执行完一道工序,接着下一道工序. 案例解析 模板方法相对来说比较简单,这里只列举一个例子供大

【创建型】原型模式

原型模式主要是用原型实例指定创建原型对象的种类,并且通过拷贝原型创建新对象.最简单的理解就是克隆.就如cocos2d-x中的 class Clonable::clone();该模式的主要目的是可以在运行时,随时创建出某个对象的副本,并且副本具有与本体一样的状态信息.类图参考如下: 模式的编码结构参考如下: 1 namespace propotype 2 { 3 /*******************************************************************

设计模式(创建型)之建造者模式(Builder Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! 概述 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端压根不用知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可.它关注如何一步一步创建一个的复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造者非常方便,无须修改已有代码,系统具有较好的扩展性. 问题来了... 你可能会有疑惑,建造者模式和抽象工

05 【创建型】原型模式 理解克隆对象~

原型模式(克隆对象) 用于创建重复的对象,用克隆对象的方式代替new 关键字的使用. 就好比细胞分裂,最开始的一个细胞通过自我复制,分裂成两个.两个分裂成四个,依次指数增长 这里就涉及到一个概念,就是创建重复的对象,就好比细胞分裂的时候就是在重复创建对象,我们可以让对象实现Cloneable接口 通过父类的clone() 方法进行创建相同的对象,这里的相同是指有相同的属性,但是他们在内存中却有不同的引用存在 代码理解 对象实现Cloneable 重写父类的clone方法 public class