golang设计模式 抽象工厂模式

101 阅读2分钟

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…