簡介 抽象工廠模式是一種創建型設計模式,它提供了一種創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。抽象工廠模式將一組具有共同主題的單個工廠封裝起來,它提供介面用於創建相關或依賴對象的家族,而不需要指定具體的類。 抽象工廠模式包含以下幾個核心角色: 抽象工廠(Abstract Facto ...
簡介
抽象工廠模式是一種創建型設計模式,它提供了一種創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。抽象工廠模式將一組具有共同主題的單個工廠封裝起來,它提供介面用於創建相關或依賴對象的家族,而不需要指定具體的類。
抽象工廠模式包含以下幾個核心角色:
- 抽象工廠(Abstract Factory):聲明瞭一組用於創建產品對象的方法,每個方法對應一種產品類型。抽象工廠可以是介面或抽象類。
- 具體工廠(Concrete Factory):實現了抽象工廠介面,負責創建具體產品對象的實例。
- 抽象產品(Abstract Product):定義了一組產品對象的共同介面或抽象類,描述了產品對象的公共方法。
- 具體產品(Concrete Product):實現了抽象產品介面,定義了具體產品的特定行為和屬性。
適用場景:
- 當一個系統需要獨立於它的產品的創建、組合和表示時
- 當一個系統需要多個系列的產品族,而不希望依賴於具體類時
優點:
- 將客戶端與具體的產品類解耦,使得客戶端可以輕鬆切換不同的具體工廠
- 符合開閉原則,易於擴展,添加新的產品族和產品等級結構
缺點:
- 增加新的產品族和產品等級結構比較複雜,需要修改抽象工廠和所有具體工廠的介面
- 對於新添加的產品族,需要修改所有的具體工廠類,這增加了系統的複雜度
示例代碼
Go
本例使用RDB
和XML
存儲訂單信息,抽象工廠分別能生成相關的著訂單信息和訂單詳情信息。如果業務邏輯中需要替換其他存儲方式,使用的時候只需要改動工廠函數相關的類即可。
abstractfactory/demo.go
package abstractfactory
// OrderMainDAO 為訂單主記錄, 抽象產品
type OrderMainDAO interface {
SaveOrderMain() string
}
// OrderDetailDAO 為訂單詳情記錄, 抽象產品
type OrderDetailDAO interface {
SaveOrderDetail() string
}
// DAOFactory DAO 抽象工廠介面
type DAOFactory interface {
CreateOrderMainDAO() OrderMainDAO
CreateOrderDetailDAO() OrderDetailDAO
}
// RDBMainDAO 關係型資料庫的OrderMainDAO實現, 具體產品
type RDBMainDAO struct{}
func (*RDBMainDAO) SaveOrderMain() string {
return "RDB main save"
}
// RDBDetailDAO 是關係型資料庫的OrderDetailDAO實現, 具體產品
type RDBDetailDAO struct{}
func (*RDBDetailDAO) SaveOrderDetail() string {
return "RDB detail save"
}
// RDBDAOFactory 是RDB抽象工廠實現, 具體工廠類
type RDBDAOFactory struct{}
func (*RDBDAOFactory) CreateOrderMainDAO() OrderMainDAO {
return &RDBMainDAO{}
}
func (*RDBDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
return &RDBDetailDAO{}
}
// XMLMainDAO 是XML存儲的OrderMainDAO 實現, 具體產品
type XMLMainDAO struct{}
func (*XMLMainDAO) SaveOrderMain() string {
return "XML main save"
}
// XMLDetailDAO 是XML存儲的OrderDetailDAO實現, 具體產品
type XMLDetailDAO struct{}
func (*XMLDetailDAO) SaveOrderDetail() string {
return "XML detail save"
}
// XMLDAOFactory 是XML抽象工廠實現, 具體工廠類
type XMLDAOFactory struct{}
func (*XMLDAOFactory) CreateOrderMainDAO() OrderMainDAO {
return &XMLMainDAO{}
}
func (*XMLDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
return &XMLDetailDAO{}
}
- 單元測試:
abstractfactory/demo_test.go
package abstractfactory
import (
"testing"
)
func TestDAO(t *testing.T) {
var factory DAOFactory
factory = &RDBDAOFactory{}
if factory.CreateOrderMainDAO().SaveOrderMain() != "RDB main save" {
t.Fatal("error with abstract factory pattern. RDB Main DAO")
}
if factory.CreateOrderDetailDAO().SaveOrderDetail() != "RDB detail save" {
t.Fatal("error with abstract factory pattern. RDB Detail DAO")
}
factory = &XMLDAOFactory{}
if factory.CreateOrderMainDAO().SaveOrderMain() != "XML main save" {
t.Fatal("error with abstract factory pattern. XML Main DAO")
}
if factory.CreateOrderDetailDAO().SaveOrderDetail() != "XML detail save" {
t.Fatal("error with abstract factory pattern. XML Detail DAO")
}
}
Python
from abc import ABC, abstractmethod
class OrderMainDAO(ABC):
"""訂單主要記錄, 抽象產品類
"""
@abstractmethod
def save_order_main(self) -> str:
pass
class OrderDetailDAO(ABC):
"""訂單詳情, 抽象產品類
"""
@abstractmethod
def save_order_detail(self) -> str:
pass
class DAOFactory(ABC):
"""抽象工廠類
"""
@abstractmethod
def create_order_main_dao(self):
pass
def create_order_detail_dao(self):
pass
class RDBMainDAO(OrderMainDAO):
"""RDB存儲訂單主要記錄, 具體產品類, 實現抽象產品類OrderMainDAO
"""
def save_order_main(self) -> str:
return "RDB Main DAO"
class RDBDetailDAO(OrderDetailDAO):
"""RDB存儲訂單詳情, 具體產品類, 實現抽象產品類OrderDetailDAO
"""
def save_order_detail(self) -> str:
return "RDB Detail DAO"
class RDBDAOFactory(DAOFactory):
"""RDB存儲, 具體工廠類, 實現抽象工廠類DAOFactory
"""
def create_order_main_dao(self):
return RDBMainDAO()
def create_order_detail_dao(self):
return RDBDetailDAO()
class XMLMainDAO(OrderMainDAO):
"""XML存儲訂單主要記錄, 具體產品類, 實現抽象產品OrderMainDAO
"""
def save_order_main(self):
return "XML Main DAO"
class XMLDetailDAO(OrderDetailDAO):
"""XML存儲訂單詳情, 具體產品類, 實現抽象產品 OrderDetailDAO
"""
def save_order_detail(self):
return "XML Detail DAO"
class XMLDAOFactory(DAOFactory):
"""XML存儲, 實現抽象工廠類DAOFactory
"""
def create_order_main_dao(self):
return XMLMainDAO()
def create_order_detail_dao(self):
return XMLDetailDAO()
if __name__ == "__main__":
factory = RDBDAOFactory()
print(factory.create_order_main_dao().save_order_main())
print(factory.create_order_detail_dao().save_order_detail())
factory = XMLDAOFactory()
print(factory.create_order_main_dao().save_order_main())
print(factory.create_order_detail_dao().save_order_detail())
參考
本文來自博客園,作者:花酒鋤作田,轉載請註明原文鏈接:https://www.cnblogs.com/XY-Heruo/p/18028234