原型模式是一种创建型模式,它通过复制已经存在的实例来产生新的实例,而不是创建新的实例。
原型模式的好处:
1.可以像抽象工厂设计模式一样,不需要在客户端程序创建对象的子类。创建值相等,只是命名不一样的同类数据。
2.对一个给定的应用,使用标准方法创建类的实例的消耗是过高的。而原型法可以消除这种消耗,毕竟复制一个已经存在的实例使程序运行更高效。
原型模式的实现
首先,声明一个包含 clone()的抽象的基类;然后,任何需要动态构造的类继承这个抽象类,并实现clone()方法。
然后,应用程序就可以在原型中调用clone()方法构造类,或者通过传递特定的参数使用工厂方法类构造特定的类,又或者由其他设计模式提供的机制来调用clone()方法来构造类。而不用使用new这样的操作。
原型模式的结构和角色:
/** * 原型类 */ abstract class PrototypeFactory implements Cloneable { public Object clone() throws CloneNotSupportedException { // call Object.clone() PrototypeFactory copy = (PrototypeFactory) super.clone(); //In an actual implementation of this pattern you might now change references to //the expensive to produce parts from the copies that are held inside the prototype.[img][/img] return copy; } abstract void prototypeFactory(int x); abstract void printValue(); } /** * 复制的具体实例 */ class PrototypeImpl extends PrototypeFactory { int x; public PrototypeImpl(int x) { this.x = x; } @Override void prototypeFactory(int x) { this.x = x; } @Override public void printValue() { System.out.println("Value :" + x); } } /** * 应用程序 */ public class PrototypeExample { private PrototypeFactory example; public PrototypeExample(PrototypeFactory example) { this.example = example; } public PrototypeFactory makeCopy() throws CloneNotSupportedException { return (PrototypeFactory) this.example.clone(); } public static void main(String args[]) { try { PrototypeFactory tempExample = null; int num = 1000; PrototypeFactory prot = new PrototypeImpl(1000); PrototypeExample cm = new PrototypeExample(prot); for (int i = 0; i < 10; i++) { tempExample = cm.makeCopy();//原型的复制 tempExample.prototypeFactory(i * num); tempExample.printValue(); } } catch (CloneNotSupportedException e) { e.printStackTrace(); } } } /* **输出:** Value :0 Value :1000 Value :2000 Value :3000 Value :4000 Value :5000 Value :6000 Value :7000 Value :8000 Value :9000 */
参考:《设计模式》《维基百科》