首页 > 代码库 > 原型模式
原型模式
原型模式:通过克隆来生成新对象,它也是个非常简单的模式。类图:
Prototype抽象原型角色:抽象角色,给出所有角色的具体原型类所需的接口。
1 public interface Prototype extends Cloneable{ 2 public Prototype clone(); 3 }
ConcretePrototype具体原型:被复制的对象,实现抽象原型角色要求的接口。
1 public class ConcretePrototype implements Prototype{ 2 public Prototype clone(){ 3 try { 4 return (Prototype) super.clone();//浅复制 5 } catch (CloneNotSupportedException e) { 6 return null; 7 } 8 } 9 }
Client客户角色:提出创建对象的请求。
1 public class Client{ 2 private static Prototype prototype = new ConcretePrototype(); 3 private static Prototype prototype2; 4 public Prototype operation(Prototype example){ 5 return (Prototype)example.clone(); 6 } 7 public static void main(String[] args) { 8 Client client = new Client(); 9 prototype2 = client.operation(prototype); 10 System.out.println(prototype.hashCode()); 11 System.out.println(prototype2.hashCode());//两个对象hashcode不同 12 } 13 }
对clone()方法的要求:
1.对任何的对象x,都有:x.clone() !=x 克隆对象与原对象地址不同。
2.对任何的对象x,都有:x.clone().getClass() ==x.getClass() 克隆对象与原对象类型相同。
3.对象x的equals()方法应该满足:x.clone().equals(x)==true
另外关于equals()方法在集合的使用:
(hashcode相等)&&(equals相等) 【注意这里是短路与】
满足上述条件时,集合才会认定这两个对象是相等的。
关于深复制与浅复制:
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。本例中的Object.clone()方法是浅复制。
在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。
在Java语言中,如果需要实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化(Serialization)等方式来实现。
总结:
原型模式在内存二进制流的拷贝,通常要比new对象性能好的多,但正因为如此构造函数是无法执行的,使用时注意这点。
原型模式