设计模式——原型模式

原型模式(Prototype)

我们先看看模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。==、我知道你们看了之后,会觉得copy一个对象?难道是换一下属性?在Java中,复制对象是通过clone()实现的。

我们看个例子:

package cs_prototype;

//原型类

public class Test_pro implements Cloneable{

@Override

public Object clone() throws CloneNotSupportedException{

Test_pro proto = (Test_pro) super.clone();

return proto;

}

}

我们看下代码很简单是吧!一个原型类Test_pro,先实现Cloneable接口,并且覆写clone方法,重要的是super.clone()调用的是Object的clone()方法,而在Object类中,clone()是native的。在这儿,我们先了解一下结合对象的浅复制和深复制。

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。

要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。深浅复制的例子:

package cs_prototype;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

public class Prototype implements Cloneable, Serializable {

private static final long serialVersionUID = 1L;

private String string;

private SerializableObject obj;

/* 浅复制 */

public Object clone() throws CloneNotSupportedException {

Prototype proto = (Prototype) super.clone();

return proto;

}

/* 深复制 */

public Object deepClone() throws IOException, ClassNotFoundException {

/* 写入当前对象的二进制流 */

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bos);

oos.writeObject(this);

/* 读出二进制流产生的新对象 */

ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bis);

return ois.readObject();

}

public String getString() {

return string;

}

public void setString(String string) {

this.string = string;

}

public SerializableObject getObj() {

return obj;

}

public void setObj(SerializableObject obj) {

this.obj = obj;

}

}

class SerializableObject implements Serializable {

private static final long serialVersionUID = 1L;

}

上面的例子比较难理解,那我们换一个简单点的老样子先来个User类吧!相信大家已经很熟练了,name、pwd、sex、age四个属性,加一个toString方法

package cs_prototype;

public class User {

private String name;

private String pwd;

private String sex;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return "User [name=" + name + ", pwd=" + pwd + ", sex=" + sex + ", age=" + age + "]";

}

}

我们再进行实现Cloneable接口和重写方法

@Override

public Object clone(){

User user = null;

try {

user=(User)super.clone();

user.name=this.name;

user.pwd=this.pwd;

user.sex=this.sex;

user.age=this.age;

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return user;

}

...

User u1= new User();

u1.setName("狗哥");

u1.setPwd("123");

u1.setSex("男");

u1.setAge(22);

System.out.println(u1);

//进行复制

User u2 = (User) u1.clone();

u2.setName("德玛");

System.out.println(u2);

...

测试结果:

User [name=狗哥, pwd=123, sex=男, age=22]

User [name=德玛, pwd=123, sex=男, age=22]

是不是懂了一点这个原型模式,这样进行拷贝会显得异常的简单方便。

时间: 2024-10-19 23:26:57

设计模式——原型模式的相关文章

谈谈设计模式~原型模式(Prototype)

返回目录 原型模式是创建型模式的一种,其特点在于通过“复制”一个已经存在的实例来返回新的实例(clone),而不是新建(new)实例.被复制的实例就是我们所称的“原型”,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效:或者创建值相等,只是命名不一样的同类数据. 从原型模式的概念中,我们可以看到,在这个模式里,拷贝是个很重要的概念,即在不创建对象的情况下,返回一个已有对象,这就是拷贝去实现的,在面向对象的编程世界里,拷贝分为浅拷

10. 星际争霸之php设计模式--原型模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248189.html============================================

炒冷饭系列:设计模式 原型模式

炒冷饭系列:设计模式 原型模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难:亲恶我,孝方贤. 一.什么是原型模式 Prototype模式是一种对象创建型模式,它採取复制原型对象的方法来创建对象的实例.使用 Prototype模式创建的实例,具有与原型一样的 数据. 二.原型模式的特点 1. 由原型对象自身创建目标对象.也就是说,对 象创建这一动作发自原型对象本身. 2.目标对象是原型对象的一个克隆

java设计模式---原型模式

原型模式也是创建型的设计模式,通过拷贝原型创建新的对象,理解原型模式必须理解java中的浅复制和深复制.复制也称为克隆.会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型.其余的都是浅拷贝. 浅克隆:浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象. 深克隆:深克隆不仅克隆所考虑的对象,也克隆它所引用的对象. 它的核心是就是原型类Prototype.Prototype类需要具备以下两个条件: 实现Cloneable接口.在java语言有一个Cloneable接

java语言实现创建型设计模式—原型模式(Prototype)

一.描述 原型模式是通过一个原型对象来标明要创建的对象的类型,然后用复制这个原型对象的方法来拷贝创建更多的同类型对象.例如我们在程序的动态运行过程中有了一个对象,这个对象中包含了一系列的有效数据,我们此时需要一个和该对象完全相同的新对象,并且在拷贝之后,新旧对象之间没有任何联系,对任何一个对象的更改都不影响另一个对象. 在java中所有类都默认继承自java.lang.Object类,在这个Object类中有一个clone()方法,该方法将返回Object对象的一个拷贝. 我们让需要被拷贝的类实

[工作中的设计模式]原型模式prototype

一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.prototype.run=function(){ alert(this.name+" is running"; } 此处的原型是js的特殊定义,在原型上定义的属性和方法所有的类进行共享. 不过设计模式中的原型模式指的是:将已有的对象作为原型,拷贝出一份具有相同属性的新的对象. 模式定义为:原型

PHP设计模式——原型模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建.它主要面对的问题是:"某些结构复杂的对象"的创建工作:由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口. 在php中,类已经实现了原

iOS常用设计模式——原型模式

1. 什么是原型模式? (what) 原型模式属于创建性设计模式,它通过拷贝的方式快速创建一个对象,这里拷贝的方式有两种:1.)浅拷贝(指针拷贝): 2.)深拷贝(值拷贝):采用原型模式创建一个新的对象效率更高. 什么是深拷贝和浅拷贝? (What) 深拷贝也叫做值拷贝,新创建的对象会在内存中开辟新的空间,而把被拷贝对象的值拷贝过来:浅拷贝也叫做指针拷贝,新创建的对象的指针与原对象的指针指向相同的内存空间,并有相同的值,浅拷贝的对象就如同原对象的影子 NSString*str = @"AAA&q

Android开发中无处不在的设计模式——原型模式

不知不觉这个系列已经写了三篇了,其实很早之前就想写设计模式了,只不过怕自己误人子弟没有提笔去写.后来在实际开发中,发现设计模式可以让一个开发人员融会贯通所学的知识,为了进一步巩固自己,就写下了这一些列文章.前面介绍了三个模式. Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 本篇文章介绍的模式其实很简单,即原型模式,按照惯例,先看定义. 用原型实例指定创建对象的种类,并通过拷贝

Java设计模式——原型模式

概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些需要说明和注意的东西在里面的.文本就详细讲解一下这些注意事项吧. 版权说明 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Coding-Naga发表日期: 2016年3月3日链接:http://blog.csdn.net/lemon_tree12138/article/d