设计模式-原型模式
一、什么是原型模式?
面试场景模拟
面试官: 你知道那些Spring的设计模式?
面试者: 工厂模式、原型模式、单例模式等等..
面试官: 小伙子不错,那你讲讲原型模式吧,毕竟这个实际生产我们用的很多。
面试者(心想): 有毒,不安常理出牌,这么简单有什么讲的....。 面试者: 让我想想..
基于面向“面试”编程,今天就让我们了解以下原型模式吧。
1.1 介绍
原型模式是一种创建型设计模式,能够复制已有对象, 而又无需使代码依赖它们所属的类。使用这种方式创建新的对象,无需再通过 new 实例化来创建对象了。因为 Object 类的 clone 方法是一个本地方法,它可以直接操作内存中的二进制流,这也是它性能比较new更好的原因。
二、优缺点
2.1 优点
-
克隆对象, 而无需与它们所属的具体类相耦合。
-
克隆预生成原型, 避免反复运行初始化代码。
-
更方便地生成复杂对象。
-
用继承以外的方式来处理复杂对象的不同配置。
2.2 缺点
-
克隆包含循环引用的复杂对象可能会非常麻烦。
三、解决方案
实现原型的三个条件:
1.实现 Cloneable 接口:该接口会告诉虚拟机可以安全的实现该类的clone方法。在JVM中,只有实现了Cloneable接口的类才可以被拷贝,或者抛出CloneNotSupportedException异常。
2.重写 Object 的 clone 方法:Java中所有类的父类都是Object类,而Object类中有一个clone方法,可以返回一个对象的一个拷贝。
3.在重写的 clone 方法中调用 super.clone():默认情况下,类不具备复制对象的能力,需要调用 super.clone() 来实现。
原型模式的主要特征就是使用clone方法复制一个对象。通常,有些人会误以为 Object a = new Object();Object b = a;这种形式就是一个复制过程,但是其只是复制对象引用,也就是a和b对象指向的是同一个内存地址,如果修改b的值,a也会跟着修改。
四、适用场景
-
如果需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。
-
如果子类的区别仅在于其对象的初始化方式, 那么可以使用该模式来减少子类的数量。 别人创建这些子类的目的可能是为了创建特定类型的对象。
五、代码实现
class Prototype implements Cloneable {
//重写clone方法
public Prototype clone(){
Prototype prototype = null;
try{
prototype = (Prototype)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return prototype;
}
}
//实现原型类
class ConcretePrototype extends Prototype{
public void show(){
System.out.println("实现原型模式类");
}
}
public class Client {
public static void main(String[] args){
ConcretePrototype cp = new ConcretePrototype();
for(int i=0; i< 10; i++){
ConcretePrototype clonecp = (ConcretePrototype)cp.clone();
clonecp.show();
}
}
}
六、参考引用
-
《Design Patterns》 亚历山大·什韦茨(Alexander Shvets)深入理解设计模式 一书