原型模式

原型模式:

  首先普及浅复制与深复制的定义。

浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之, 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
 
深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之, 深复制把要复制的对象所引用的对象都复制了一遍。

 

1、定义:原型模式就是通过一个原型对象来表明要创建的对象类型,然后用复制这个对象的方法来创建更痛类型的对象。

2、原理:有两部分组成,抽象原型和具体原型。

3、使用时机:系统需要 创建吃的对象是动态加载的,而且产品具有一定层次时,可以考虑使用原型模式。

1>当要实例化的类是在运行时刻指定时,例如,通过动态装载;

2>或者为了避免创建一个与产品类层次平行的工厂类层次时;

3>或者当一个类的实例只能有几个不同状态组合中的一种时。

4>建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

4、效果:

1>可以再运行时刻增加和删除产品。

2>可以通过改变值来指定产品。

3>可以通过改变结构来指定新对象。

4>减少子类的构造

5>可以用类动态配置应用。

5、实现:

1>使用一个原型管理器

2>实现克隆操作(浅拷贝和深拷贝)

3>初始化克隆对象。

6、使用原型模式的意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

7、解决的问题:

比如有一个对象,在某一时刻该对象中已经包含了一些有效的值,此时可能会需要一个和该对象完全相同的新对象,并且此后对新对象的任何改动都不会影响到原来对象中的值,也就是说新对象与原来的对象是两个独立的对象,但新对象的初始值是由原来的对象确定的。

Clone:

赋值创建对象:

1>java中赋值创建对象是可以实现对象的重用的,但是新对象和原对象是同一个引用;如果修改其中的一个对象的值,则另外的一个对象也会发生改变。

2>使用clone方法会返回对象的一个拷贝,这样一来,如果修改一个对象的值,则另外的对象不会发生改变的。


原型模式UML图:


UML

请注意,在这边Cloneable并非指Java中的java.lang.Cloneable,而是指支持原型复制的对象,必须实作之公开协议。

同的语言可能提供不同程度支持之对象复制技术,以Java而言,java.lang.Object本身即定义有clone()方法,因此所有的对象基本上皆具自我复制之能力,不过真正要让对象支持复制,则对象必须实作java.lang.Cloneable这个标示接口(Tag interface)。


原型模式浅拷贝与原型模式深度拷贝:

看看这样一个示例:有个类(DogClone)实现了Java的Cloneable接口,也实现了Object的clone()方法,它持有另一个没有实现Cloneable接口并且没有复写Object的clone()方法的引用(Dog)。如果Dog同时实现了clone()方法也实现了Cloneable接口,在对DogClone做科隆操作的时候会不会影响dog的值呢?

区别就是重载了clone函数,由浅复制到了深复制。  

@Override 
 public Dog clone() throws CloneNotSupportedException {  
  return (Dog)super.clone();  
 }

 

转载:http://www.cnblogs.com/jqbird/archive/2011/08/19/2145417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值