[设计模式]创建型模式-抽象工厂模式

简介: [设计模式]创建型模式-抽象工厂模式

简介

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式将一组具有共同主题的单个工厂封装起来,它提供接口用于创建相关或依赖对象的家族,而不需要指定具体的类。

抽象工厂模式包含以下几个核心角色:

  • 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
  • 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
  • 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。

适用场景:

  • 当一个系统需要独立于它的产品的创建、组合和表示时
  • 当一个系统需要多个系列的产品族,而不希望依赖于具体类时

优点:

  • 将客户端与具体的产品类解耦,使得客户端可以轻松切换不同的具体工厂
  • 符合开闭原则,易于扩展,添加新的产品族和产品等级结构

缺点:

  • 增加新的产品族和产品等级结构比较复杂,需要修改抽象工厂和所有具体工厂的接口
  • 对于新添加的产品族,需要修改所有的具体工厂类,这增加了系统的复杂度

示例代码

Go

本例使用RDBXML存储订单信息,抽象工厂分别能生成相关的著订单信息和订单详情信息。如果业务逻辑中需要替换其他存储方式,使用的时候只需要改动工厂函数相关的类即可。

  • abstractfactory/demo.go
package abstractfactory  
  
// OrderMainDAO 为订单主记录, 抽象产品  
type OrderMainDAO interface {  
    SaveOrderMain() string  
}  
  
// OrderDetailDAO 为订单详情记录, 抽象产品  
type OrderDetailDAO interface {  
    SaveOrderDetail() string  
}  
  
// DAOFactory DAO 抽象工厂接口  
type DAOFactory interface {  
    CreateOrderMainDAO() OrderMainDAO  
    CreateOrderDetailDAO() OrderDetailDAO  
}  
  
// RDBMainDAO 关系型数据库的OrderMainDAO实现, 具体产品  
type RDBMainDAO struct{}  
  
func (*RDBMainDAO) SaveOrderMain() string {  
    return "RDB main save"  
}  
  
// RDBDetailDAO 是关系型数据库的OrderDetailDAO实现, 具体产品  
type RDBDetailDAO struct{}  
  
func (*RDBDetailDAO) SaveOrderDetail() string {  
    return "RDB detail save"  
}  
  
// RDBDAOFactory 是RDB抽象工厂实现, 具体工厂类  
type RDBDAOFactory struct{}  
  
func (*RDBDAOFactory) CreateOrderMainDAO() OrderMainDAO {  
    return &RDBMainDAO{}  
}  
  
func (*RDBDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {  
    return &RDBDetailDAO{}  
}  
  
// XMLMainDAO 是XML存储的OrderMainDAO 实现, 具体产品  
type XMLMainDAO struct{}  
  
func (*XMLMainDAO) SaveOrderMain() string {  
    return "XML main save"  
}  
  
// XMLDetailDAO 是XML存储的OrderDetailDAO实现, 具体产品  
type XMLDetailDAO struct{}  
  
func (*XMLDetailDAO) SaveOrderDetail() string {  
    return "XML detail save"  
}  
  
// XMLDAOFactory 是XML抽象工厂实现, 具体工厂类  
type XMLDAOFactory struct{}  
  
func (*XMLDAOFactory) CreateOrderMainDAO() OrderMainDAO {  
    return &XMLMainDAO{}  
}  
  
func (*XMLDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {  
    return &XMLDetailDAO{}  
}
  • 单元测试:abstractfactory/demo_test.go
package abstractfactory  
  
import (  
    "testing"  
)  
  
func TestDAO(t *testing.T) {  
    var factory DAOFactory  
  
    factory = &RDBDAOFactory{}  
    if factory.CreateOrderMainDAO().SaveOrderMain() != "RDB main save" {  
       t.Fatal("error with abstract factory pattern. RDB Main DAO")  
    }  
  
    if factory.CreateOrderDetailDAO().SaveOrderDetail() != "RDB detail save" {  
       t.Fatal("error with abstract factory pattern. RDB Detail DAO")  
    }  
  
    factory = &XMLDAOFactory{}  
    if factory.CreateOrderMainDAO().SaveOrderMain() != "XML main save" {  
       t.Fatal("error with abstract factory pattern. XML Main DAO")  
    }  
    if factory.CreateOrderDetailDAO().SaveOrderDetail() != "XML detail save" {  
       t.Fatal("error with abstract factory pattern. XML Detail DAO")  
    }  
}

Python

from abc import ABC, abstractmethod
class OrderMainDAO(ABC):
    """订单主要记录, 抽象产品类
    """
    @abstractmethod
    def save_order_main(self) -> str:
        pass
class OrderDetailDAO(ABC):
    """订单详情, 抽象产品类
    """
    @abstractmethod
    def save_order_detail(self) -> str:
        pass
class DAOFactory(ABC):
    """抽象工厂类
    """
    @abstractmethod
    def create_order_main_dao(self):
        pass
    def create_order_detail_dao(self):
        pass
class RDBMainDAO(OrderMainDAO):
    """RDB存储订单主要记录, 具体产品类, 实现抽象产品类OrderMainDAO
    """
    def save_order_main(self) -> str:
        return "RDB Main DAO"
class RDBDetailDAO(OrderDetailDAO):
    """RDB存储订单详情, 具体产品类, 实现抽象产品类OrderDetailDAO
    """
    def save_order_detail(self) -> str:
        return "RDB Detail DAO"
class RDBDAOFactory(DAOFactory):
    """RDB存储, 具体工厂类, 实现抽象工厂类DAOFactory
    """
    def create_order_main_dao(self):
        return RDBMainDAO()
    def create_order_detail_dao(self):
        return RDBDetailDAO()
class XMLMainDAO(OrderMainDAO):
    """XML存储订单主要记录, 具体产品类, 实现抽象产品OrderMainDAO
    """
    def save_order_main(self):
        return "XML Main DAO"
class XMLDetailDAO(OrderDetailDAO):
    """XML存储订单详情, 具体产品类, 实现抽象产品 OrderDetailDAO
    """
    def save_order_detail(self):
        return "XML Detail DAO"
class XMLDAOFactory(DAOFactory):
    """XML存储, 实现抽象工厂类DAOFactory
    """
    def create_order_main_dao(self):
        return XMLMainDAO()
    def create_order_detail_dao(self):
        return XMLDetailDAO()
if __name__ == "__main__":
    factory = RDBDAOFactory()
    print(factory.create_order_main_dao().save_order_main())
    print(factory.create_order_detail_dao().save_order_detail())
    factory = XMLDAOFactory()
    print(factory.create_order_main_dao().save_order_main())
    print(factory.create_order_detail_dao().save_order_detail())

参考

相关文章
|
6月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
181 16
|
6月前
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
217 15
|
6月前
|
设计模式 JavaScript Java
【设计模式】【创建型模式】原型模式(Prototype)
一、入门 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。 原型模式的核心是克隆(Clone),即通过复制现有
201 15
|
6月前
|
设计模式 Java Apache
【设计模式】【创建型模式】建造者模式(Builder)
一、入门 什么是建造者模式? 建造者模式(Builder Pattern)是一种创建型设计模式,用于逐步构建复杂对象。 它通过将对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。 为什么
228 14
|
6月前
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
225 14
|
8月前
|
设计模式 XML Java
设计模式觉醒系列(03)创建型模式的5个设计模式 | 一口气讲全讲透
本文详细介绍了设计模式中的创建型模式,包括建造者模式、原型模式、单例模式、工厂方法模式和抽象工厂模式。创建型模式关注对象的创建过程,隐藏了创建细节,以提高代码的可维护性和可扩展性。通过具体的实战demo和应用场景分析,展示了每种模式的特点和优势。例如,建造者模式适用于复杂对象的分步骤构建;原型模式通过复制对象实现高效复用;单例模式确保全局唯一实例;工厂方法模式和抽象工厂模式则提供了灵活的对象创建机制,支持多类型产品族的生产。这些模式在实际开发中能够简化客户端代码,提升系统灵活性和复用性。
|
10月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——抽象工厂模式
抽象工厂模式是一种创建型设计模式,提供接口用于创建一系列相关或依赖的对象,无需指定具体类。它解决了产品族问题,管理和创建一组相关产品。结构上包括抽象工厂、具体工厂、抽象产品和具体产品。适用于创建相关对象、产品族固定但种类变化的场景。优点是分离接口与实现、管理产品族方便且扩展性好;缺点是产品族扩展困难且代码复杂度增加。通过配置文件和反射机制可进一步改进,使系统更灵活易扩展。
200 17
|
12月前
|
设计模式 架构师 Java
设计模式之 5 大创建型模式,万字长文深剖 ,近 30 张图解!
设计模式是写出优秀程序的保障,是让面向对象保持结构良好的秘诀,与架构能力与阅读源码的能力息息相关,本文深剖设计模式之 5 大创建型模式。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
设计模式之 5 大创建型模式,万字长文深剖 ,近 30 张图解!
|
11月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
11月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章