原型模式(prototype pattern)


原型模式是一种创建型模式,它通过复制已经存在的实例来产生新的实例,而不是创建新的实例。
原型模式的好处:
    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
*/

参考:《设计模式》《维基百科》

猜你喜欢

转载自mbs061.iteye.com/blog/1095676
今日推荐