创建型:五. 抽象工厂模式

抽象工厂模式是什么

抽象工厂是一种创建型设计模式,用于产品族的构建。它能创建一系列相关的对象, 而无需指定其具体类。

为什么用抽象工厂模式

在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。为了满足这一需求,就有了抽象工厂模式。即当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个不同类型的具体产品时需要使用抽象工厂模式。

抽象工厂模式怎么实现

抽象工厂大体上和工厂方法模式一样,只是工厂方法模式的工厂只有一个方法,而抽象工厂模式的一个工厂有多个方法可以生成多个对象。

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()

}

优点

  1. 你可以确保同一工厂生成的产品相互匹配。
  2. 你可以避免客户端和具体产品代码的耦合。
  3. 单一职责原则。 你可以将产品生成代码抽取到同一位置, 使得代码易于维护。

缺点

  1. 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。
posted @ 2022-04-10 10:54  EthanWell  阅读(93)  评论(0编辑  收藏  举报