设计模式系列,原型模式

在面试中,设计模式,源码、数据结构、框架原理、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 接口;并且特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候,克隆的深度你就得通盘考虑了。

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

设计模式系列,原型模式

: » 设计模式系列,原型模式

原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/252137.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论