原型模式

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

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

  

转载于:https://www.cnblogs.com/ergou/p/6986238.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值