`
543089122
  • 浏览: 149958 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

简单_原型模式(Prototype)

阅读更多
原型模式说白了也就是克隆自身,为了解决某些复杂对象的创建工作而生的。

网上许多关于原型模式的文章东西倒是说了很多而且还扯到了工厂模式等一些其他的模式,
我个人认为那样真是啰嗦的要死不说还把问题搞负责了。

克隆分为浅克隆和深克隆,浅克隆紧紧克隆对象的基本数据类型的值,深克隆会连引用类型也克隆。JAVA中凡是实现了java.lang.Cloneable接口的类都具有克隆功能,而这样的克隆是浅克隆的,深克隆的原理是:通过把克隆对象序列化到内存然后再反序列化读出。

package design.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;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 作者 E-mail: jqsl2012@163.com
 * @version 创建时间:2012-1-12 下午10:55:57 <br>
 */
public class Person implements Cloneable, Serializable {
	public Map<String, String> map = new HashMap<String, String>();;

	@Override
	protected Object clone() throws CloneNotSupportedException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		try {
			oos = new ObjectOutputStream(baos);
			oos.writeObject(this);

			ByteArrayInputStream bais = new ByteArrayInputStream(
					baos.toByteArray());
			ois = new ObjectInputStream(bais);
			return ois.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (oos != null)
				try {
					oos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			if (ois != null)
				try {
					ois.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
		return null;
	}
}



深克隆也叫做完整克隆,我想浅克隆那就应该称作部分克隆了吧。下面是HashMap的clone方法
/**
     * Returns a shallow copy of this <tt>HashMap</tt> instance: the keys and
     * values themselves are not cloned.
     *
     * @return a shallow copy of this map.
     */
    public Object clone() {
        HashMap<K,V> result = null;
	try { 
	    result = (HashMap<K,V>)super.clone();
	} catch (CloneNotSupportedException e) { 
	    // assert false;
	}
        result.table = new Entry[table.length];
        result.entrySet = null;
        result.modCount = 0;
        result.size = 0;
        result.init();
        result.putAllForCreate(this);

        return result;
    }
0
1
分享到:
评论

相关推荐

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

    即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...

    实例讲解C++编程中对设计模式中的原型模式的使用

    原型模式的实现完整代码示例(code):原型模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。 代码片断 1:Prototype.h //Prototype.h...

    Python设计模式之原型模式实例详解

    一个原型模式的简单demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' """ 大话设计模式 设计模式——原型模式 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝...

    JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)

     既然你想了解继承,证明你对JavaScript面向对象已经有一定的了解,如还有什么不理解的可以参考《面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式》,接下来讲一般通过那些方法完成...

    23种java版设计模式源码案例.zip

    原型模式(prototype) 结构型模式(structure) 适配器模式(adaptor) 桥接模式(bridge) 组合模式(composite) 装饰器模式(decorate) 外观模式(facecade) 享元模式(flyweight) 代理模式(proxy) 行为型模式(behaviour) ...

    Java设计模式,并加上个人理解

    10. 原型模式 (Prototype Pattern) 11. 组合模式 (Composite Pattern) 12. 装饰者模式 (Decorator Pattern) 13. 访问者模式 (Visitor Pattern) 14. 迭代器模式 (Iterator Pattern) 15. 享元模式 ...

    浅析php原型模式

    原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。 应用场景: 类的资源非常多、性能和安全要求,一般和工厂方法结合使用。 复制代码 代码如下: &lt;?php /**  * 原型模式  */ //...

    小D深入浅出设计模式+框架源码剖析实战

    ├─第一章 旭瑶-小滴...│ 5.1-创建型设计模式-Prototype原型设计模式实战《上》.mp4 │ 5.2-创建型设计模式-Prototype原型设计模式实战《下》.mp4 │ 6.1-接口之间的桥梁-适配器设计模式你知道多少.mp4 │ 6.4

    研磨设计模式(完整带书签).part2.pdf

    第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...

    构造函数+原型模式构造js自定义对象(最通用)

    [removed] /* * 组合模式: 构造函数模式+原型模式 这种方式是javascript中最通用的创建对象的方式 变量类型属性:用构造函数传递 函数类型属性:用原型模式声明 */ function Student(name,age){ this.name=name;...

    C#设计模式.PDF

    四、 带Prototype Manager的原型模式 73 五、 浅拷贝与深拷贝 77 六、 Prototype模式的优点与缺点 79 C#设计模式(10)-Adapter Pattern 80 一、 适配器(Adapter)模式 80 二、 类的Adapter模式的结构: 81 三、 ...

    [源代码] 《易学 设计模式》 随书源代码

    第07章 照猫画虎:原型模式 (Prototype) 第08章 独一无二:单例模式 (Singleton) 第09章 一目了然:外观模式 (Facade) 第10章 改头换面:适配器模式 (Adapter) 第11章 越俎代庖:代理模式 (Proxy) 第12章 真人不露相...

    C#设计模式大全

    四、 带Prototype Manager的原型模式 五、 浅拷贝与深拷贝 六、 Prototype模式的优点与缺点 C#设计模式(10)-Adapter Pattern 一、 适配器(Adapter)模式 二、 类的Adapter模式的结构: 三、 类的Adapter...

    Delphi模式编程第一分卷

    第8章 原型模式(Prototype) 8.1 模式解说 8.2 结构和用法 8.2.1 模式结构 8.2.2 代码模板 8.3 范例与实践 8.3.1 Delphi对象的克隆 8.3.2 用原型模式克隆字体 8.3.3 Delphi对象流化与原型模式 8.3.4 范例...

    Delphi模式编程第二分卷

    第8章 原型模式(Prototype) 8.1 模式解说 8.2 结构和用法 8.2.1 模式结构 8.2.2 代码模板 8.3 范例与实践 8.3.1 Delphi对象的克隆 8.3.2 用原型模式克隆字体 8.3.3 Delphi对象流化与原型模式 ...

    研磨设计模式(完整带书签).part1.pdf

    第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...

    JS原型和原型链原理与用法实例详解

    它没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式,来实现继承。 Brendan Eich设计javascript之初是为了实现网页与浏览器...

    研磨设计模式-part2

    第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...

    研磨设计模式-part4

    第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...

    研磨设计模式-part3

    第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 观察者模式(Observer) 第13章 命令模式(Command) 第14章 迭代器模式(Iterator) 第15章 组合模式(Composite) ...

Global site tag (gtag.js) - Google Analytics