
抽象工廠(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();
}
}
}
結語
如果改天要新增第三種控制器,只需要確認是哪種通訊方式並實作封包格式即可。
抽象工廠模式可以做出多層的軟體架構,只要按實際的程式架構去應用就能寫出漂亮的程式。
以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。
發佈留言