ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-10 11:00:24  阅读:124  来源: 互联网

标签:创建 工厂 抽象 SaveOrderDetail func SaveOrderMain type


抽象工厂模式是什么

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

为什么用抽象工厂模式

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

抽象工厂模式怎么实现

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

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. 由于采用该模式需要向应用中引入众多接口和类, 代码可能会比之前更加复杂。

标签:创建,工厂,抽象,SaveOrderDetail,func,SaveOrderMain,type
来源: https://www.cnblogs.com/ourongxin/p/16125011.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有