在软件开发中,有时候可能会需要创建一些特别复杂的对象,如果系统中已经存在同样类型的对象,并且不同的属性个数相差不大的话,用Prototype模式可能是一个理想的选择。
定义 :用原型实例指定创建物件的种类,并且通过拷贝这些原型创建新的物件。
Prototype 模式允许一个物件再创建另外一个可定制的物件,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型物件传给那个要发动创建的物件,这个要发动创建的物件通过请求原型物件拷贝它们自己来实施创建。
类图如下:
从图上可以看出,使用方法很简单,只要调用对象的clone方法返回一个新的对象就可以了。但是为什么没有其他新的方法来实现这个模式呢?因为Java中的Object提供了clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单.
在这个clone方法中,我们只要调用Object的克隆方法返回一个对象,就可以以最简单的方式实现Prototype模式。
在其他编程语言中,就需要创建一个当前类的新的对象,然后把当前对象本身的各属性的值复制一份给新创建的对象,并且返回新对象即可。
从上图中的main函数的调用过程来看,也可以很清晰地看出Prototype模式和其他创建型模式的不同:Prototype模式创建对象不是通过new一个类,而是通过一个现有的对象实例来的。
什么时候应该使用prototype模式呢?
1.当你要创建的对象与现有运行时对象相似度很大时
2.为了避免创建类的工厂类导致层次复杂度增加时
3.当类的实例只有不多的几种状态时(此时需要引进原型管理器)
Prototype模式常用在一些对象管理器中。这些对象管理器本身一般为单例模式,主要负责对象的创建和返回。由于返回的对象的类型基本上是一致的,而且返回的对象的各项属性大多保持一致,只有极少数属性才需要修改,所以用Prototype无疑是极好的选择。
需要注意的是:浅拷贝和深拷贝的区别。
简单的讲,浅拷贝就是只对当前对象的直属属性进行复制,如果其属性是基本类型的话,就复制原对象的值;如果其属性是其他对象的话,就复制对象的地址。而深拷贝则是麻烦的多,如果其属性是对象的话,就需要创建一个新的子属性的对象,并且对这个对象的各项属性进行复制,如果子属性还有子属性的话,则需要递归的进行复制操作。
一切就看需求,如果那些属性的值不会被变更的话,那么只需要实现浅拷贝即可;否则,深拷贝就是必须的。
package com.kingswood.pattern.creational.protoType;
public interface ProtoType extends Cloneable {
public Object clone();
}
package com.kingswood.pattern.creational.protoType;
public class ConcreteProtoType implements ProtoType {
private String propA;
private String propB;
public String getPropA() {
return propA;
}
public void setPropA(String propA) {
this.propA = propA;
}
public String getPropB() {
return propB;
}
public void setPropB(String propB) {
this.propB = propB;
}
public Object clone(){
try {
return super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
}
package com.kingswood.pattern.creational.protoType;
import junit.framework.TestCase;
public class Client extends TestCase {
public static void testMethod(){
ConcreteProtoType proto = new ConcreteProtoType();
proto.setPropA("propA");
proto.setPropB("propB");
ConcreteProtoType newProto = (ConcreteProtoType) proto.clone();
assertNotSame(proto, newProto);
assertEquals(proto.getPropA(), newProto.getPropA());
assertEquals(proto.getPropB(), newProto.getPropB());
}
}
以上样例使用浅克隆方式实现proto type模式,浅克隆无法对对象中包含的其他非java原是类型数据进行复制。如果需要复制其他非java原是类型数据,则需要使用深克隆方式,对象以及其内部所有对象必须实现java.io.Serializable接口,clone方法改写成以下形式:
public Object clone(){
try {
ByteArrayOutputStream ot = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(ot);
oo.writeObject(this);
ByteArrayInputStream it = new ByteArrayInputStream(ot.toByteArray());
ObjectInputStream oi = new ObjectInputStream(it);
return (oi.readObject());
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
分享到:
相关推荐
Prototype模式 即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制...
23种设计模式之Prototype模式代码,这是自己学习Prototype模式顺带写的代码,仅供学习交流
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/1032892
设计模式之Prototype
设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator...
NULL 博文链接:https://wy649898543.iteye.com/blog/1431591
设计模式 t05Prototype
C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) 体验课程
设计模式精解-GoF 23 种设计模式解析附 C++实现源码 目 录 引 言 0.1 设计模式解析(总序) 0.2 设计模式解析后记 0.3 与作者联系 1 创建型模式 1.1 Factory模式 1.2 AbstactFactory模式 1.3 Singleton...
C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) (Level 300)
C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)
C++设计模式代码资源10_prototype.zip
原型模式的意图是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 为了避免创建一个与产品类层次平行的工厂类层次时;...
设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator...
设计模式C++学习之原型模式(Prototype)
C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) C#面向对象设计模式纵横谈(7):Adapter 适配器模式(结构型模式) C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) C#面向对象设计...
├─第一章 旭瑶-小滴...│ 5.1-创建型设计模式-Prototype原型设计模式实战《上》.mp4 │ 5.2-创建型设计模式-Prototype原型设计模式实战《下》.mp4 │ 6.1-接口之间的桥梁-适配器设计模式你知道多少.mp4 │ 6.4
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源分。敬请期待。 这是第6节:Prototype...
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源分。敬请期待。 这是第6节:Prototype...