2013年11月9日 星期六

C# Design Pattern - Abstract Factory 抽象工廠模式

在Java之中,Abstract這名詞,相信程式員對它都不默生,一個類別被定義時,可以僅宣告方法名稱而不實作當中的邏輯,這樣的方法稱之為「抽象方法」(Abstract method),如果一個類別中包括了抽象方法,則該類別稱之為「抽象類別」(Abstract class),抽象類別是個未定義完全的類別,所以它不能被用來生成物件,它只能被擴充,並於擴充後完成未完成的抽象方法定義。

在C#裡,微軟官方給予它的定義,略有不同 ,以下是微軟官方的說明:
abstract 修飾詞表示要修飾的項目遺失或實作不完整。 abstract 修飾詞可用於類別、方法、屬性、索引子 (Indexer) 和事件。 在類別宣告裡使用 abstract 修飾詞,表示該類別只是當做其他類別的基底類別而已。 成員如果標記為抽象,或是包含在抽象類別 (Abstract Class) 內,則必須由衍生自此抽象類別的類別實作這個成員。

在Design Pattern的思維裡,有一種運作結構,叫作「Abstract Factory」。
在複雜的程式架構中,將許多的組件加以分門別類,然後從中取出性質相似與功能相近的Object,使其集中,能夠簡化程式系統組件的複雜度。而 Abstract Factory 模式,正是用來協助程式員將Object分類與集中管理的方法。

以下是C# Abstract Factory的簡單範例:
public interface IHouseA
{
    //執行的方法陳述句
}

public interface IHouseB
{
    //執行的方法陳述句
}

public interface IHouseFactory
{
    IHouseA CreateHouseA();
    IHouseB CreateHouseB();

}

上面的結構,基本上是Factory Pattern,也就是說,透過Interface,將IHouseA和IHouseB分別獨立出來,在經由IHouseFactory做管理,所以程式員只要更改個別的陳述句,並不會影響其它函式。

public class HouseA_Door : IHouseA
{
    internal HouseA_Door()
    { /*建構函式 */}
}

public class HouseB_Window : IHouseB
{
    internal HouseB_Window()
    { /* 建構函式 */}
}


public class HouseA_Chair : IHouseA
{
    internal HouseA_Chair()
    { /* 建構函式 */}
}

public class HouseB_Desk : IHouseB
{
    internal HouseB_Desk()
    { /* 建構函式 */}
}

HouseA和HouseB分別繼承IHouseA和IHouseB,然後各別去建構自身的House裡的內容。但本質上是2個不同的House,只是裡面的裝飾,可以任君擺設,自行建構函式。

public class SmallHouseFactory : IHouseFactory
{
    public IHouseA CreateHouseA()
    {
        return new HouseA_Door();
    }

    public IHouseB CreateHouseB()
    {
        return new HouseB_Window();
    }
}


public class BigHouseFactory : IHouseFactory
{
    public IHouseA CreateHouseA()
    {
        return new HouseA_Chair();
    }

    public IHouseB CreateHouseB()
    {
        return new HouseB_Desk();
    }

}

各個Class透過Abstract Factory的分門別類,再透過Interface各別獨立,只要透過繼承,程式員就可以輕易的修改而不影響流程架構。

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

沒有留言:

張貼留言