【设计模式】原型模式,这是我学过最简单的设计模式了。

这是我参与更文挑战的第24天,活动详情查看:更文挑战

?设计模式目录

前言

原型模式是属于创建型模式的一种,我在前面也是介绍了单例模式、构建器模式、工厂模式,这是创建型模式的最后一种了。在原型模式结束后,我会很快地进入结构性模式的学习。

什么是原型模式(Prototype)
概念

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

———百度百科

简单来说,就是通过某个对象复制一个跟它一模一样的新对象。

最形象的比喻就是,孙悟空拔毛后轻轻一吹就生成很多分身一样。

nidemaowoxiangbajiuba

优点
  1. 性能高。如果是通过Java的Object自带的clone方法,就可以跳开构造器,直接通过内存二进制流的复制来创建,会有更好的性能。
  2. 简化创建对象的过程。想创建一个一模一样的对象只需要调用clone方法即可,不需要再关心对象内部的数据和类的构造方法。
  3. 节省创建对象的前置条件。有些对象在创建之前,可能还需要查询数据库来获取一些参数,这里想做个备份的话就只需要clone即可。
缺点

有优点,缺点肯定也是有的。

  1. 必须实现Cloneable接口。
  2. 违背了开放封闭原则。想要调用clone方法,就需要对已有的类进行修改,首先实现Cloneable接口,然后修改clone方法。如果是全新的类倒不会违背。
  3. 实现复杂。当对象中有一个成员属性是引用对象或者有循环引用时,实现起来会异常复杂,Java提供的clone方法是不能够复制引用引用对象的,想要复制一份对象内的引用对象就得自己动手。

yi

原则

“+”代表遵守,“-”代表不遵守或者不相关

原则 开放封闭 单一职责 迪米特 里氏替换 依赖倒置 接口隔离 合成复用
+ +
适用场景
  1. 对象初始化需要耗费较多的资源。
  2. 通过new创建对象时需要做非常繁琐的数据准备,且目前的对象可以反复使用。
  3. 需要大量备份的情况。

原型模式可以与工厂模式一同使用,Java已经为原型模式提供了底层的方法(clone),使用起来也是非常的方便。

如何实现

这里就简单的展示一下如何实现原型模式,Java Object的clone我想在另外一篇文章再详细讲讲,还会涉及到浅拷贝和深拷贝,我也会一起讲。

turanwakeng

想要实现,原型模式,就需要三样东西:

  1. 抽象原型类或原型接口。原型实现类必须要继承或者实现的,这里的话可以使用Object的clone方法,但必须实现Cloneable接口
  2. 具体原型实现类。必须实现抽象原型类或原型接口,然后实现或重写clone方法
  3. 访问类。访问类去调用原型实现类的clone方法。

上类结构图。

image-20210528152813071

上代码

具体原型实现类:PrototypeEntity

/**
 * Created on 2021/5/28.
 *
 * @author xuxiaobai
 */
public class PrototypeEntity implements Cloneable {
    private int a;
    private int b;
    
    public PrototypeEntity(int a,int b){
        this.a=a;
        this.b=b;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        //这里只是使用了clone这么简单,如果存在引用对象就不止这么简单了
        return super.clone();
    }

    /**
     * get、set方法省略
     */
}
复制代码

访问类:PrototypeTest

/**
 * Created on 2021/5/28.
 *
 * @author xuxiaobai
 */
public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        PrototypeEntity p1=new PrototypeEntity();
        Object clone = p1.clone();
    }
}
复制代码

喂,事情已经搞定了

总结

原型模式也是一个比较简单的设计模式了,实际开发中的话,我目前还没有使用过,大家可以参考使用场景后酌情使用,不一定非要使用设计模式,其他模式也是一样。

原型模式违背了开放封闭原则、里氏替换原则。对于已有的类来说,去增加一个clone方法,这必然不符合开放封闭原则;父类已经写好的方法,子类居然去修改,这必然不符合里氏替换原则。

原型模式遵守了单一职责原则、迪米特法则。这个方法只负责clone本对象,使用原型模式的话可以封闭内部的成员属性,只提供一个clone方法。

其他原则的话都是可扩展的,这里没有违不违背一说。

到这里创建型模式就告一段落了,后面会开启结构型模式的学习。

看到这里还不给我点赞?

快给我点赞

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享