java设计模式-原型模式

来源:互联网 发布:手机站优化 编辑:程序博客网 时间:2024/05/16 08:43

原型模式定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:
通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。


原型模式有两种实现方法:

一种是简单的创建模式。一种是登记式的。

同时Java中的提供clone()方法来实现对象的克隆,

第一种:这里截取一张图

这里截取一张图

public abstract class AbstractSpoon implements Cloneable{   String spoonName;   public void setSpoonName(String spoonName) {this.spoonName = spoonName;}  public String getSpoonName() {return this.spoonName;}  public Object clone()   {    Object object = null;    try {      object = super.clone();    } catch (CloneNotSupportedException exception) {      System.err.println("AbstractSpoon is not Cloneable");    }    return object;  }}
下面定义一个具体的实现

public class SoupSpoon extends AbstractSpoon{   public SoupSpoon()  {    setSpoonName("Soup Spoon");   }} 

这里的调用方法是


AbstractSpoon spoon = new SoupSpoon();AbstractSpoon spoon2 = spoon.clone();


第二中:登记式的,这里截取一张图

这里截取一张图


这里比上面就多了一个PrototypeManager,这里没有写里面的实例变量

public class SpoonManager {    /**     * 用来记录原型的编号和原型实例的对应关系     */    private static Map<String,Prototype> map = new HashMap<String,Prototype>();        private SpoonManager(){}        public synchronized static void setPrototype(String prototypeId , Prototype prototype){        map.put(prototypeId, prototype);    }        public synchronized static void removePrototype(String prototypeId){        map.remove(prototypeId);    }        public synchronized static Prototype getPrototype(String prototypeId) throws Exception{        Prototype prototype = map.get(prototypeId);        if(prototype == null){            throw new Exception("您希望获取的原型还没有注册或已被销毁");        }        return prototype;    }}

这里的调用方法就是

AbstractSpoon spoon1 = new SoupSpoon(); SpoonManager.setPrototype("1", spoon1);            //获取原型来创建对象 AbstractSpoon spoon2 = SpoonManager.getPrototype("1").clone();

这样就有了spoon2是由spoon1 克隆而来,同时这样的方法的一个好处是

你将创建过的对象都保存在一个map中,所以不需要你自己去记住有哪些引用,这样的话之后你每一个想得到一个对象,你可以先去map中找有没有已经登记在map中的,有的话直接使用,没有的情况再去创建。这样当想创建的对象很多的时候会很有用。



0 0
原创粉丝点击