首页 > 其他 > 详细

05 设计模式 原型设计模式

时间:2020-06-19 17:14:15      阅读:71      评论:0      收藏:0      [点我收藏+]

原型设计模式

原型设计模式:顾名思义,通过一个原型来建立对象。因为有些对象过于庞大,通过new关键字创立十分消耗资源,故采用原型设计模式,可以理解为克隆

在Java中原型设计模式主要靠clone()方法进行

进行clone需要注意的点:

  1. 类本身需要实现Cloneable接口
  2. 如果其中有对象就需要覆写clone()方法,否则就会出现改一个,全部都被改的情况。

代码如下:

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Video implements Cloneable{
    String name;
    Date date;
	/*==================以下为重点=========================*/
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();
        Video video = (Video)obj;
        video.date = (Date) this.getDate().clone();
        return video;
    }

}

测试方法:

public static void main(String[] args) throws CloneNotSupportedException {
    Date date = new Date();
    Video video1 = new Video("我的视频", date);
    Video video2 = (Video) video1.clone();
    System.out.println(video1);
    System.out.println(video2);

    date.setTime(1868421597);

    System.out.println(video1);
    System.out.println(video2);
}

没有覆写clone方法时的结果

Video{name=‘我的视频‘, date=Fri Jun 19 16:41:47 CST 2020}
Video{name=‘我的视频‘, date=Fri Jun 19 16:41:47 CST 2020}
Video{name=‘我的视频‘, date=Thu Jan 22 23:00:21 CST 1970}
Video{name=‘我的视频‘, date=Thu Jan 22 23:00:21 CST 1970}

会发现,本来并没有想要改date属性,值却被修改了。

这是因为对象video1中保存的是date对象的地址,修改的是date对象本身。而这两个对象都指向一个地址,故都会发生改变

覆写后的结果:

Video{name=‘我的视频‘, date=Fri Jun 19 16:43:32 CST 2020}
Video{name=‘我的视频‘, date=Fri Jun 19 16:43:32 CST 2020}
Video{name=‘我的视频‘, date=Thu Jan 22 23:00:21 CST 1970}
Video{name=‘我的视频‘, date=Fri Jun 19 16:43:32 CST 2020}

由此发现正常了!

一般在使用时,原型设计模式并不会单独使用,会与工厂模式相结合,更加高效地创建对象

05 设计模式 原型设计模式

原文:https://www.cnblogs.com/shimeath/p/13163885.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!