1. 应用场景
如果一个对象的创建总是由几种固定组件不同方式组合而成; 如果对象之间仅仅实例属性不同。将不同情况的对象缓存起来,直接克隆使用。也许这比采用传递参数重新 new 一个对象要来的快一些与工厂模式的区别:原型模式相当于”改进版的工厂模式”:对象实现了Clonnable()接口,加入了 java 反射机制,去掉了工厂模式繁多的子类
2.概念
使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。
3. Class Diagram
(1)Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,它可是抽象类也可以是接口,甚至可以是具体实现类。
(2)ConcretePrototype(具体原型类):它实现抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
(3)Client(客户端):在客户类中,让一个原型对象克隆自身从而创建一个新的对象。
4. Implementation
public abstract class Prototype {
abstract Prototype myClone();
}
public class ConcretePrototype extends Prototype {
private String filed;
public ConcretePrototype(String filed) {
this.filed = filed;
}
@Override
Prototype myClone() {
return new ConcretePrototype(filed);
}
@Override
public String toString() {
return filed;
}
}
public class Client {
public static void main(String[] args) {
Prototype prototype = new ConcretePrototype("abc");
Prototype clone = prototype.myClone();
System.out.println(clone.toString());
}
}
运行结果:
abc
5. 优点和缺点
5.1 优点
- 向客户隐藏制造新实例的复杂性
- 提供让客户能够产生未知类型对象的选项
- 在某些环境下,复制对象比创建对象更有效。
5.2 用途和缺点
- 在一个复制的类层次中,当系统必须从其中的许多类型创建对象时,可以考虑原型。
- 使用原型模式的缺点:对象的复制有时相当复杂。