2013年11月17日 星期日

C# Design Pattern - Prototype 原型模式

又來到了Design Pattern的時間了,可能是我對程式比較偏愛(其實也是因為我覺得有比較多的東西可以寫Orz),其實我還蠻想出一本有關Design Pattern的書籍的。
任何一種的設計構思,一定會有所謂的Prototype,當然,程式也不例外。畢竟在模組架構上,一定要有一個根基和初始結構。
在開發過程中,經常面臨著結構複雜的物件的建置工作,因需求的變化,但是它們卻擁有比較穩定一致的介面,這就是初始結構。
用原型實例指定建置物件的種類,並且透過複製這些原型創建新的物件。

建置一個抽象類別,用來複製物件,但不實作:
public abstract class NormalActor
{
    public abstract NormalActor clone();

}

透過繼承,實作繼承至父類別而來的clone,並且覆寫實作,可以如法泡製一個相同的NormalActorB、C的類別,並覆寫實作不同的建構子:


public class NormalActorA : NormalActor
{
    public override NormalActor clone()
    {
        Console.WriteLine("NormalActorA is call");
        return (NormalActor)this.MemberwiseClone();
    }
}

public class GameSystem
{
    public void Run(NormalActor normalActor)
    {
        NormalActor normalActor1 = normalActor.clone();
        NormalActor normalActor2 = normalActor.clone();
        NormalActor normalActor3 = normalActor.clone();
        NormalActor normalActor4 = normalActor.clone();
        NormalActor normalActor5 = normalActor.clone();
    }
}

class Program
{
    static void Main(string[] args)
    {
        GameSystem gameSystem = new GameSystem();
        gameSystem.Run(new NormalActorA());
    }

}

需要創建新的物件(flyActor)時,只需New此抽象類別,然後具體類執行Clone():


public abstract class FlyActor
{
    public abstract FlyActor clone();

}

public class FlyActorB : FlyActor
{
    public override FlyActor clone()
    {
        return (FlyActor)this.MemberwiseClone();
    }

}

class Program
{
    static void Main(string[] args)
    {
        GameSystem gameSystem = new GameSystem();
        gameSystem.Run(new NormalActorA(), new FlyActorB());
    }
}

Prototype同樣用於隔離類物件的使用者和具體類型(易變類)之間的耦合關係
New這些易變類別的實體物件採用Prototype clone的方法來做,可以非常靈活地動態new擁有某些穩定介面中的新物件只要在註冊的地方不斷地Clone。
Clone顧名思義,就是完整的複製,之後只需要為些許不同的改變而改變,達到「擁有比較穩定一致的介面」的需求。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言