首頁 » 設計模式 » 抽象工廠(Abstract factory)

抽象工廠(Abstract factory)

作者:

分類:

抽象工廠(Abstract factory)

概念

抽象工廠模式是一種建立型模式,概念是由工廠方法所延伸,也就是將工廠層給抽象化,可以把一個主題的物件組合出共用的工廠,而不是產生更多的工廠。

上回的工廠方法是用兩種常見的工業通訊方式(Ethernet、SerialPort)舉例,這回就繼續延伸,將控制器的控制功能實作出來。假設控制器有開與關兩個方法,而且不同通訊方式的封包不能通用,也就是Ethernet對應一種封包,SerialPort對應另一種封包,而且將封包程式碼寫在通訊方法內就違反原則了,此時抽象工廠就符合一個主題的架構。

範例

//**************
//* author: cian
//* 20231023
//**************

/* 控制器列表(for UI Binding) */
enum ControllerEnum
{
    TYPE_A,
    TYPE_B,
}

/* 連線物件介面 */
interface IConnector
{
    void Connect();
    void Disconnect();
    void WriteCmd(byte[] cmd);
}

class Ethernet : IConnector { /*Implement*/ }
class SerialPort : IConnector { /*Implement*/ }

/* 連線封包介面 */
interface IPacket
{
    byte[] GetOpenCmd();
    byte[] GetCloseCmd();
}

class EthernetPacket : IPacket { /*Implement*/ }
class SerialPacket : IPacket { /*Implement*/ }

abstract class ControllerBase
{
    public abstract IConnector Connector { get; protected set; }
    public abstract IPacket Packet { get; protected set; }

    public virtual void Connect() { Connector.Connect(); }
    public virtual void Disconnect() { Connector.Disconnect(); }
    public virtual void OpenControl() 
    { 
        Connector.WriteCmd(Packet.GetOpenCmd()); 
    }
    public virtual void CloseControl() 
    { 
        Connector.WriteCmd(Packet.GetCloseCmd()); 
    }
}

class TypeA : ControllerBase
{
    public override IConnector Connector 
        { get; protected set; } = new Ethernet();
    public override IPacket Packet 
        { get; protected set; } = new EthernetPacket();
}

class TypeB : ControllerBase
{
    public override IConnector Connector 
        { get; protected set; } = new SerialPort();
    public override IPacket Packet 
        { get; protected set; } = new SerialPacket();
}

static class ControllerFactory
{
    public static ControllerBase GetController(ControllerEnum controller)
    {
        switch (controller)
        {
            case ControllerEnum.TYPE_A:
                return new TypeA();
            case ControllerEnum.TYPE_B:
                return new TypeB();
            default:
                throw new NotImplementedException();
        }
    }
}

結語

如果改天要新增第三種控制器,只需要確認是哪種通訊方式並實作封包格式即可。

抽象工廠模式可以做出多層的軟體架構,只要按實際的程式架構去應用就能寫出漂亮的程式。

以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。

    「cian」的個人頭像

    留言

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *