设计模式系列,原型模式

JAVA herman 149浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

在面试中,设计模式,源码、数据结构、框架原理、JVM、GC、中间件等一个也少不了,所有的这些东西都需要平时进行积累。我这里后面会做一个专题,把设计模式单独做成一个菜单,方便后面面试的各位网友。

设计模式之原型模式

在 Java 中创建对象的方法有很多,比如:通过 new、反射、Object.clone、反序列化、Unsafe.allocateInstance 等。他们的用处各不相同,今天我借助 Object.clone 来讲一个原型设计模式。

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

在现实生活中也处处离不开原型模式。比如,细胞的分裂等。

原型模式非常的简单。简单到可以用下面的 3 个类搞定它的类图。

原型模式类图

我们常见的游戏打飞机,或者植物大战僵尸。都可以利用到原型设计模式。

原型模式在打飞机游戏中的使用

每个飞机,或者炮弹的坐标可能不一样,但是要产生非常多的飞机,如果一个一个的来创建,代价太高,因此,我们可以使用原型模式来解决。

public class AirPlane implements Cloneable{
    private int x;//横坐标
    private int y = 0;//纵坐标
    public AirPlane(int x) {//构造器
        this.x = x;
    }
    public int getX() {
        return x;
    }
    public int getY() {
        return y;
    }
    public void setX(int x) {
        this.x = x;
    }
    public void fly(){
        y += 5;
    }
    //重写克隆方法
    @Override
    public AirPlane clone() throws CloneNotSupportedException {
        return (AirPlane)super.clone();
    }
}

原型模式非常的简单,有些网友可能会觉得难,那是因为它的使用场景你没有搞清楚。下面我总结了一下原型模式的常用场景。

  • 资源优化场景。
  • 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
  • 性能和安全要求的场景。
  • 通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
  • 一个对象多个修改者的场景。
  • 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
  • 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。

通过这几个场景,我们也可以看出来,原型模式:能够提高性能;同时还能够逃避构造函数的约束。但是除了这两个优点外,缺点也很明显。必须实现 Cloneable 接口;并且特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候,克隆的深度你就得通盘考虑了。

设计模式很多人都看过很多遍了,但是一到面试还是不会。原因就是使用的场景不熟悉,并且没有在正式的代码中使用过。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 设计模式系列,原型模式