参考文献

原型模式

  • 使用原型实例指定要创建的对象类型,并通过复制此原型来创建新对象.
  • 通过复制生成实例

组件

  • Prototype : 负责定义用于复制现有实例来生成新实例的方法.
  • ConcretePrototype : 负责实现复制现有实例并生产新实例的方法.
  • Client : 负责使用复制实例的方法生产新的实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface Prototype {
public abstract Object clone ();
}

public class ConcretePrototype implements Prototype {
public Object clone() {
return super.clone();
}
}

public class Client {

public static void main( String arg[] ) {
ConcretePrototype obj1= new ConcretePrototype ();
ConcretePrototype obj2 = ConcretePrototype)obj1.clone();
}

}

实现方式

  • 创建一个原型接口(或基类): 在接口中声明一个克隆方法,用于复制对象并返回副本.如果已经有一个类层次结构存在,只需在所有类中添加克隆方法即可.
  • 定义具体的原型类: 每个具体的原型类都必须实现克隆方法,并在方法中使用 new 运算符调用自身的构造函数来创建新的实例,并将原型对象的数据复制到新实例中.如果需要修改子类,则需要调用父类构造函数来复制私有成员变量值.
  • 创建原型注册表: 可以创建一个中心化的原型注册表,用于存储常用的原型对象.注册表可以通过工厂类或在原型基类中添加获取原型的静态方法来实现.
  • 使用原型模式: 客户端可以通过向原型注册表请求特定的原型对象来获取克隆的实例.注册表根据客户端提供的条件搜索合适的原型对象,并对其进行克隆操作,然后将复制生成的对象返回给客户端.

使用场景

  • 对象的创建过程复杂且耗时:如果创建一个对象需要较长的时间或复杂的过程(例如数据库查询、网络请求等),那么可以使用原型模式来复制一个现有对象,避免重复的创建过程,提高性能.
  • 需要避免构造函数的开销:有些对象的构造函数执行代价较大,包括资源分配、初始化操作等.通过使用原型模式,可以避免执行这些昂贵的构造函数,而是直接复制一个现有对象,并根据需要进行必要的修改.
  • 需要动态配置对象:如果需要根据不同的配置参数创建对象,可以使用原型模式.只需创建并配置一个原型对象,然后通过复制该对象来快速创建新的对象副本,并进行进一步的个性化配置.
  • 类层次结构复杂且扩展性好:当类层次结构非常复杂且难以预测未来会有哪些新的子类时,可以使用原型模式.通过在基类中添加克隆方法,每个具体子类都能够复制自己,并返回一个与当前对象类型相同的新实例.
  • 避免创建过多的子类:当类的实例化过程中只有一些细微的差异时,可以使用原型模式.通过复制原型对象并在副本上进行修改,可以避免创建大量相似但功能稍有不同的子类.