原型模式
-
深克隆和浅克隆:
Clone在Java中是一种常见的操作,目的是为了获取对象的副本。所以就产生了两种克隆方式(深克隆、浅克隆)。
- 深克隆:深克隆其实就是复制出一个对象的副本(分配内存,复制粘贴),也就是创建了一个和原来一样的对象,属性中的引用也就变成了副本的地址,不会指向原对象。
- 浅克隆:顾名思义,就是不会去分配内存来创建新的对象,而是依旧使用原对象,属性中的引用指向原对象。
深克隆 浅克隆 内存地址不同,但属性相同,是两个对象 内存地址和属性都相同,是一个对象 -
定义:
用一个已经创建的实例最为原型模型,然后复制该原型对象来创建出一个与其相同或者相似的对象。用这种方式创建对象非常高效,并且无需知道对象创建的细节。
-
使用场景:
-
需要创建很多相同或者相似对象,因为clone比new效率要高很多。
-
资源优化场景。
-
性能和安全有要求的场景。
-
-
UML:
-
Propotype:原型模式的抽象类。
-
ConcretePropotype1和ConcretePropotype2:具体的原型类。
-
-
优点:
- 使用原型模式比直接new对象更有效率,因为直接操作二进制流,特别是复制大对象时,性能的差别非常明显。
- 隐藏了制造新实例对象的复杂性,让创造对象像复制粘贴一样简单。
-
缺点:
- 使用原型模式复制对象不会调用构造方法,所以原型模式无法和单例模式组合使用。
- 原型模式不能有final对象。
- Object类的clone方法只会拷贝基本数据类型,对于数组、对象需要另行拷贝。(深拷贝、浅拷贝问题)
-
样例:
public abstract class Prototype implements Cloneable{ private String id ; public Prototype(){ this.id = id ; } public String getId(){ return this.id ; } public Prototype clone() throws CloneNotSupportedException{ return (Propotype) super.clone() ; } }
public class CreateProtype extends Prototype{ public CreateProtype(String id){ super(id) ; } }
public class JavaDemo{ public static void main(String args[]){ Propotype p1 = new CreateProtype("1") ; Porpotype p2 = p1.clone() ; System.out.println(p1 == p2) ; } }