ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

05 设计模式 原型设计模式

2020-06-19 16:53:45  阅读:220  来源: 互联网

标签:name 05 clone Video CST date 原型 设计模式


原型设计模式

原型设计模式:顾名思义,通过一个原型来建立对象。因为有些对象过于庞大,通过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}

由此发现正常了!

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

标签:name,05,clone,Video,CST,date,原型,设计模式
来源: https://www.cnblogs.com/shimeath/p/13163885.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有