8种常用的设计模式(7) —— 原型模式

1.什么是原型模式

  • 原型(prototype)的理解需要和复制/克隆联系
  • 原型的意思就是按照对象A,复制/拷贝一份,形成一个单独独立的新的对象B,我们对对象B进行操作,而原来被复制/拷贝的对象A就称为对象B的原型
  • 原型模式的使用场景就是当一个对象的创建比较复杂的时候,我们耗费了一些资源好不容易创建出了一个对象A,如果此时我们需要再创建一个对象B,那么我们不需要再去经过前面繁琐的步骤创建对象B,而是直接复制粘贴对象A,得到一个完整对立的对象B

2.怎么使用原型模式

  • 原型模式的克隆实现方式就是原来我们学习的对象的克隆,即实现接口Cloneable并调用方法clone()
  • 克隆实现原理
    在这里插入图片描述

1.代码实现

  • 定义一个类用于被克隆
    import java.util.Date;
    
    public class Prototype implements Cloneable{    //需要被克隆的类
       private String name;
       private Date date;
    
       public Prototype(String name,  Date date) {
           this.name = name;
           this.date = date;
       }
    
       @Override
       protected Object clone() throws CloneNotSupportedException {    //覆写Object的clone()
           return super.clone();
       }
    }
    
    在这里插入图片描述
  • 编写一个类进行克隆
    import java.util.Date;
    
    public class Clone {
       public static void main(String[] args) throws CloneNotSupportedException {
           Date date = new Date();
           Prototype p1 = new Prototype("原型1号",date);
           Prototype p2 = (Prototype) p1.clone();
           System.out.println("对象==>P1 = "+p1);
           System.out.println("对象==>P2 = "+p2);
    
           System.out.println("哈希值==>P1 = "+p1.hashCode());
           System.out.println("哈希值==>P2 = "+p2.hashCode());
       }
    }
    

在这里插入图片描述


  • 上面的对象克隆是存在问题的,即对象的"浅拷贝"是有问题的,原因:
    import java.util.Date;
    
    public class Clone {
        public static void main(String[] args) throws CloneNotSupportedException {
            Date date = new Date();
            Prototype p1 = new Prototype("原型1号",date);
            Prototype p2 = (Prototype) p1.clone();
            System.out.println("Date修改之前===================>");
            System.out.println("对象==>P1 = "+p1);
            System.out.println("对象==>P2 = "+p2);
            date.setTime(5153414);
            System.out.println("Date修改之后===================>");
            System.out.println("对象==>P1 = "+p1);
            System.out.println("对象==>P2 = "+p2);
        }
    }
    
    在这里插入图片描述
  • 可见就算p1和p2是两个相互独立的对象,但是它们的内部属性指向的对象是一样的,这样的情况导致的后果就是所有克隆得到的对象,一旦我们修改了原型中某一个成员属性的对象引用,克隆的对象也会跟着改变,这显然就和两个相互独立的对象的情况相互矛盾的,则就是克隆浅克隆(只是克隆了对象本身,对于对象中的对象属性并没有克隆,而是指向了同一个引用)的缺陷,所以我们需要实现克隆的深克隆(将对象的对象属性也进行克隆)
    在这里插入图片描述

在这里插入图片描述

  • 改造clone()
        @Override
        protected Object clone() throws CloneNotSupportedException {    //覆写Object的clone()
            Object obj = super.clone();//obj就是返回的克隆对象
            Prototype prototype = (Prototype) obj;//强转类型设置时间属性
            prototype.setDate((Date) this.date.clone());//设置克隆对象的date属性为当前进行克隆对象的原型对象的date成员属性的克隆
            return obj;//返回克隆好的对象
        }
    
  • 测试
    在这里插入图片描述
  • 通过深克隆解解决了浅克隆的对象属性的问题

3.小结

  • 到此,所有的创建型模式就讲解完了
    • 单例模式:保证类的实例全局唯一
    • 工厂模式:实现了创建者和调用者的分离;分为简单工厂模式和工厂方法模式
    • 抽象工厂模式:就是对工厂进行抽象,创建的工厂针对于生产产品族,即工厂可以生产一系列的产品
    • 建造者模式:实现了对象的创建和使用的分离
    • 原型模式:通过Java提供的克隆方法提高复杂对象的生产方式
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值