Java设计模式 create Prototype

原型模式定义:
用原型实例指定建立对象的种类,而且经过拷贝这些原型建立新的对象.
java

Prototype模式容许一个对象再建立另一个可定制的对象,根本无需知道任何如何建立的细节,工做原理是:经过将一个原型对象传给那个要发动建立的对象,这个要发动建立的对象经过请求原型对象拷贝它们本身来实施建立。c#

如何使用?
由于Java中的提供clone()方法来实现对象的克隆,因此Prototype模式实现一会儿变得很简单.
测试

import java.util.Hashtable;

public class SymbolLoader  {
    private Hashtable symbols = new Hashtable();
    public SymbolLoader() {
           symbols.put("Line", new LineSymbol());
           symbols.put("Note", new NoteSymbol());
    }
    public Hashtable getSymbols() {
        return symbols;
    }
}

public class LineSymbol extends Graphic {
    public LineSymbol() {
    }

    public void DoSomething() {
        System.out.println("I am used to draw a line !");
    }
}
public class NoteSymbol extends Graphic {
    public NoteSymbol() {
    }

    public void DoSomething() {
        System.out.println("I am used to draw a note !");
    }
}
public interface IGraphic extends Cloneable, Serializable {
    public String getName() ;
    public void setName(String gName);
}
public abstract class Graphic implements IGraphic {
    private String name;
    
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e){
            System.out.println("Do not support clone !!!");
            throw new InternalError();
        }
    }
   
    /* (non-Javadoc)
     * @see corner.dp.create.Prototype.mypackage.IGraphic#getName()
     */
    public String getName() {
        return name;
    }
    
    /* (non-Javadoc)
     * @see corner.dp.create.Prototype.mypackage.IGraphic#setName(java.lang.String)
     */
    public void setName(String gName) {
        name = gName;
    }

    public abstract void DoSomething();
}
测试代码:

public class GraphicTool  {
    public static void main(String[] args) {
        //-----  Initial our prototype instance  ---------- 
        SymbolLoader myLoader = new SymbolLoader();
        Hashtable mySymbols = myLoader.getSymbols();

        //-----  Draw a Line  -------------------------------
        Graphic myLine = (Graphic)((Graphic)mySymbols.get("Line")).clone();
        myLine.DoSomething();
    }
}
相关文章
相关标签/搜索