1、描述
提供一个接口用于创建相关对象的家族
围绕一个超级工厂,创建其他的工厂
在工厂模式中,一个具体的工厂对应一种具体的产品,但有时候我们需要工厂可以提供多个产品对象,而不是单一产品对象。
产品等级结构:就是产品的继承结构,如一个摩星工场,可以画出圆形、长方形、正方形的模型。这里抽象的模型工厂和具体的模型构成了产品等级结构
产品族:在抽象工厂模式中,产品族指的是同一个工厂生产的,位于不同产品等级结构的一组产品。如模具厂生产的红色圆形模具,圆形模具属于模型产品等级结构中,红色属于颜料产品等级结构中。
2、实现
本例子中使用RDB和XML存储订单信息,抽象工厂分别能生成相关的主订单信息和订单详情信息
// 定义抽象工厂接口
type DAOFactory interface {
CreateOrderMainDAO() OrderMainDAO
CreateOrderDetailDAO() OrderDetailDAO
}
// 定义产品接口
type OrderMainDAO interface {
SaveOrderMain()
}
type OrderDetailDAO interface {
SaveOrderDetail()
}
//实现几种产品
type RDBMainDAO struct {}
func (*RDBMainDAO) SaveOrderMain() {
fmt.Println("rdb main save")
}
type XMLMainDAO struct {}
func (*XMLMainDAO) SaveOrderMain() {
fmt.Println("xml main save")
}
type RDBDetailDAO struct {}
func (*RDBDetailDAO) SaveOrderDetail() {
fmt.Println("rdb detail save")
}
type XMLDetailDAO struct {}
func (*XMLDetailDAO) SaveOrderDetail() {
fmt.Println("xml datail save")
}
//抽象工厂实现
//RDB DAO工厂实现
type RDBDAOFactory struct {}
func (*RDBDAOFactory) CreateOrderMainDAO() OrderMainDAO {
return &RDBMainDAO{}
}
func (*RDBDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
return &RDBDetailDAO{}
}
//XML DAO工厂实现
type XMLDAOFactory struct {}
func (*XMLDAOFactory) CreateOrderMainDAO() OrderMainDAO {
return &XMLMainDAO{}
}
func (*XMLDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
return &XMLDetailDAO{}
}
//**************************客户端代码:
func getMainAndDetail(factory DAOFactory) {
factory.CreateOrderMainDAO().SaveOrderMain()
factory.CreateOrderDetailDAO().SaveOrderDetail()
}
func main() {
var factory DAOFactory
factory = &RDBDAOFactory{}
getMainAndDetail(factory)
factory = &XMLDAOFactory{}
getMainAndDetail(factory)
}
3、优点
当一个产品族中多个对象被设计成一起工作时,他可以保证客户始终只使用同一个产品族中的对象
4、缺点
产品族扩展非常困难,需要修改很多代码
参考: www.codercto.com/a/36719.htm… www.jianshu.com/p/86e883478… blog.csdn.net/qq_43510019…