本文介绍23种设计模式之原型模式。
定义
当创建改定的类的实例的过程很昂贵或者很复杂时,就使用原型模式。原型模式比较简单,就是通过clone的方式复制一个出来。
描述
- 模式名称:PROTOTYPE(原型)
- 类型:对象创建型模式
- 意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
- 适用性:
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
- 效果:
- 优点:
- 可以在运行时刻增加和删除产品。
- 使用克隆的方式复制,比new一个对象性能更高。
- 缺点:
- 必须实现 Cloneable 接口。
- clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。
类图
简单实现
原型类实现clone方法
public abstract class Prototype implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public abstract void print();
}
public class ConcretePrototype extends Prototype {
@Override
public void print() {
System.out.println("实现类");
}
}
客户端调用
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
ConcretePrototype concretePrototype = new ConcretePrototype();
for (int i = 0; i < 10; i++) {
Prototype clone = (Prototype) concretePrototype.clone();
clone.print();
}
}
}
深拷贝与浅拷贝
- 浅拷贝:Object类的clone方法只会拷贝对象中的基本的数据类型(8种基本数据类型byte,char,short,int,long,float,double,boolean),对于数组、容器对象、引用对象(String除外)等都不会拷贝。
- 深拷贝:是包括引用类型的对象也完全复制一份,这样就不会像浅拷贝一样指向同一个对象了。 如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。可以通过序列化来实现