创建型:五. 抽象工厂模式
抽象工厂模式是什么
抽象工厂是一种创建型设计模式,用于产品族的构建。它能创建一系列相关的对象, 而无需指定其具体类。
为什么用抽象工厂模式
在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。为了满足这一需求,就有了抽象工厂模式。即当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个不同类型的具体产品时需要使用抽象工厂模式。
抽象工厂模式怎么实现
抽象工厂大体上和工厂方法模式一样,只是工厂方法模式的工厂只有一个方法,而抽象工厂模式的一个工厂有多个方法可以生成多个对象。
abstract_factory.go抽象工厂
package abstract_factory
//OrderMainDAO 为订单主记录
type OrderMainDAO interface {
SaveOrderMain()
}
//OrderDetailDAO 为订单详情纪录
type OrderDetailDAO interface {
SaveOrderDetail()
}
//DAOFactory DAO 抽象模式工厂接口
type DAOFactory interface {
CreateOrderMainDAO() OrderMainDAO
CreateOrderDetailDAO() OrderDetailDAO
}
rdb.go具体实现
package abstract_factory
import "fmt"
//RDBMainDAP 为关系型数据库的OrderMainDAO实现
type RDBMainDAO struct{}
//SaveOrderMain ...
func (*RDBMainDAO) SaveOrderMain() {
fmt.Print("rdb main save\n")
}
//RDBDetailDAO 为关系型数据库的OrderDetailDAO实现
type RDBDetailDAO struct{}
// SaveOrderDetail ...
func (*RDBDetailDAO) SaveOrderDetail() {
fmt.Print("rdb detail save\n")
}
//RDBDAOFactory 是RDB 抽象工厂实现
type RDBDAOFactory struct{}
func (*RDBDAOFactory) CreateOrderMainDAO() OrderMainDAO {
return &RDBMainDAO{}
}
func (*RDBDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
return &RDBDetailDAO{}
}
xml.go具体实现
package abstract_factory
import "fmt"
//XMLMainDAO XML存储
type XMLMainDAO struct{}
//SaveOrderMain ...
func (*XMLMainDAO) SaveOrderMain() {
fmt.Print("xml main save\n")
}
//XMLDetailDAO XML存储
type XMLDetailDAO struct{}
// SaveOrderDetail ...
func (*XMLDetailDAO) SaveOrderDetail() {
fmt.Print("xml detail save")
}
//XMLDAOFactory 是RDB 抽象工厂实现
type XMLDAOFactory struct{}
func (*XMLDAOFactory) CreateOrderMainDAO() OrderMainDAO {
return &XMLMainDAO{}
}
func (*XMLDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
return &XMLDetailDAO{}
}
example.go客户端调用示例
package abstract_factory
func Example() {
//dao := new(RDBDAOFactory)
//dao.CreateOrderMainDAO().SaveOrderMain()
//dao.CreateOrderDetailDAO().SaveOrderDetail()
dao := new(XMLDAOFactory)
dao.CreateOrderMainDAO().SaveOrderMain()
dao.CreateOrderDetailDAO().SaveOrderDetail()
}
优点
- 你可以确保同一工厂生成的产品相互匹配。
- 你可以避免客户端和具体产品代码的耦合。
- 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。
缺点
- 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。