这是我参与更文挑战的第24天,活动详情查看:更文挑战
前言
原型模式是属于创建型模式的一种,我在前面也是介绍了单例模式、构建器模式、工厂模式,这是创建型模式的最后一种了。在原型模式结束后,我会很快地进入结构性模式的学习。
什么是原型模式(Prototype)
概念
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
———百度百科
简单来说,就是通过某个对象复制一个跟它一模一样的新对象。
最形象的比喻就是,孙悟空拔毛后轻轻一吹就生成很多分身一样。
优点
- 性能高。如果是通过Java的Object自带的clone方法,就可以跳开构造器,直接通过内存二进制流的复制来创建,会有更好的性能。
- 简化创建对象的过程。想创建一个一模一样的对象只需要调用clone方法即可,不需要再关心对象内部的数据和类的构造方法。
- 节省创建对象的前置条件。有些对象在创建之前,可能还需要查询数据库来获取一些参数,这里想做个备份的话就只需要clone即可。
缺点
有优点,缺点肯定也是有的。
- 必须实现Cloneable接口。
- 违背了开放封闭原则。想要调用clone方法,就需要对已有的类进行修改,首先实现Cloneable接口,然后修改clone方法。如果是全新的类倒不会违背。
- 实现复杂。当对象中有一个成员属性是引用对象或者有循环引用时,实现起来会异常复杂,Java提供的clone方法是不能够复制引用引用对象的,想要复制一份对象内的引用对象就得自己动手。
原则
“+”代表遵守,“-”代表不遵守或者不相关
原则 | 开放封闭 | 单一职责 | 迪米特 | 里氏替换 | 依赖倒置 | 接口隔离 | 合成复用 |
---|---|---|---|---|---|---|---|
– | + | + | – | – | – | – | |
适用场景
- 对象初始化需要耗费较多的资源。
- 通过new创建对象时需要做非常繁琐的数据准备,且目前的对象可以反复使用。
- 需要大量备份的情况。
原型模式可以与工厂模式一同使用,Java已经为原型模式提供了底层的方法(clone),使用起来也是非常的方便。
如何实现
这里就简单的展示一下如何实现原型模式,Java Object的clone我想在另外一篇文章再详细讲讲,还会涉及到浅拷贝和深拷贝,我也会一起讲。
想要实现,原型模式,就需要三样东西:
- 抽象原型类或原型接口。原型实现类必须要继承或者实现的,这里的话可以使用Object的clone方法,但必须实现Cloneable接口
- 具体原型实现类。必须实现抽象原型类或原型接口,然后实现或重写clone方法
- 访问类。访问类去调用原型实现类的clone方法。
上类结构图。
上代码
具体原型实现类: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