05 设计模式 原型设计模式

原型设计模式

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

由此发现正常了!

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

猜你喜欢

转载自www.cnblogs.com/shimeath/p/13163885.html