首页 > 代码库 > 原型模式

原型模式

原型模式:通过克隆来生成新对象,它也是个非常简单的模式。类图:

技术分享

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对象性能好的多,但正因为如此构造函数是无法执行的,使用时注意这点。

  

原型模式