複習:GoF的23種設計模式之Prototype模式(創建型)

閒扯一下,我們都喫過月餅吧,那大家知道月餅是怎麼製作出來的嗎?(以前的工藝)

我小時候有經歷過月餅的製作,提前買好麪粉、糖、摸具、鴨蛋黃等,將麪粉揉成團然後再用杆搓成麪皮,將鴨蛋黃、糖配料什麼的一股腦的捲成一團,用麪皮包裹好,再使用模具整好形狀,烤至金黃,出鍋開喫。

Prototype模式(原型)

上面講的使用模具整理好月餅,也可以看做一個原型模式,我們製作模具的過程,就已經完成了一個形狀滿意的月餅,後面製作月餅都和前一個類似。

原型模式定義:通過“複製”一個已經存在的實例來返回新的實例,而不是新鍵實例。被複制的實例就是我們稱的“原型”。

  1. 複製一個實例相比new一個實例更加高效;
  2. 對於創建複製的對象或者說是幾個類整合到一起的對象,更加方便;

示例代碼


public class PrototypeTest {
    public static void main(String[] args) {
        PrototypeManage manage = new PrototypeManage();
        Prototype prototype1 = new Mooncake("月餅");
        manage.register("月餅",prototype1);
        //通過原型創建新對象。
        Prototype prototype2 = manage.create("月餅");
        prototype2.user();
        System.out.println(prototype1 == prototype2);//false
    }
}

interface Prototype extends Cloneable {
    public abstract void user();
    public abstract Prototype createClone();
}
class Mooncake implements Prototype{
    String str = null;
    public Mooncake(String s) {
        this.str = s;
    }
    public void user() {
        System.out.println("這是一個複雜的"+str);
    }
    public Prototype createClone() {
        Prototype prototy = null;
        try {
            prototy = (Prototype) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototy;
    }
}

class PrototypeManage {
    Map<String, Prototype> map = new HashMap<String, Prototype>();
    public void register(String name, Prototype prototype) {
        map.put(name, prototype);
    }
    public Prototype create(String prototypeName) {
        Prototype clone = map.get(prototypeName).createClone();
        return clone;
    }
}

UML類圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章