首页 > 其他分享 >[设计模式]创建型模式-抽象工厂模式

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

时间:2024-02-22 21:23:20浏览次数:22  
标签:main 设计模式 return factory 模式 抽象 save order

简介

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

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

  • 抽象工厂(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())

参考

标签:main,设计模式,return,factory,模式,抽象,save,order
From: https://www.cnblogs.com/XY-Heruo/p/18028234

相关文章

  • flink之核心抽象--Window窗口及窗口操作全面详解
    flink之核心抽象--Window窗口及窗口操作全面详解标签:flink 窗口 String val -- 元素 Long window1.Windows1.1.基本概念窗口是处理无限流的核心。窗口将流划分为固定大小的“桶”,方便程序员在上面应用各种计算。Window操作是流式数据处理的一种非常核心的抽象,......
  • 3分钟看懂设计模式01:策略模式
    一、什么是策略模式定义一些列算法类,将每一个算法封装起来,并让它们可以互相替换。策略模式让算法独立于使用它的客户而变化,是一种对象行为型模式。以上是策略模式的一般定义,属于是课本内容。在没有真正理解策略模式之前并不需要对此定义下过多功夫,读一遍直接进入下一章节。二......
  • Kafka 3.6.1 Kraft模式 集群安装与部署
    1.集群规划hadoop02(192.168.58.130)hadoop03(192.168.58.131)hadoop04(192.168.58.132)kafkakafkakafka2.集群部署1.下载kafka二进制包https://kafka.apache.org/downloads2.解压mkdir/usr/kafkatar-zxvf/home/kafka_2.13-3.6.1.tgz-C/usr/kafka/3.......
  • 责任链模式与spring容器的搭配应用
    背景有个需求,原先只涉及到一种A情况设备的筛选,每次筛选会经过多个流程,比如先a功能,a功能通过再筛选b功能,然后再筛选c功能,以此类推。现在新增了另外一种B情况的筛选,B情况同样需要A情况的筛选流程,并且需要在A情况的基础上,新增另外的功能筛选,这里假设A需要a、b、c功能的筛选,而B需要a......
  • phpstorm开启debug断点调试模式
    查看php版本查看自己php的版本,使用:phpinfo()函数<?phpechophpinfo();XdebugXdebug:Support—TailoredInstallationInstructions右击查看index.php源代码并复制到Xdebug中点击分析查看分析结果修改php配置文件vi/opt/homebrew/etc/php/7.4/conf.d/99-xdebug.......
  • 设计模式浅析(六) ·命令模式
    设计模式浅析(六)·命令模式日常叨逼叨java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷......
  • 我们在SqlSugar开发框架中,用到的一些设计模式
    我们在《SqlSugar开发框架》中,有时候都会根据一些需要引入一些设计模式,主要的目的是为了解决问题提供便利和代码重用等目的。而不是为用而用,我们的目的是解决问题,并在一定的场景下以水到渠成的方式处理。不过引入任何的设计模式,都会增加一定的学习难度,除非是自己本身领会比较好了,......
  • 智能测试时代来临!人工智能如何颠覆测试开发传统模式?
    在数字化时代,软件测试不再仅仅是繁琐的手动过程,智能测试与智能化测试技术正在成为测试领域的创新引擎,为质量保障和软件开发提供前所未有的机会。为了帮助大家系统地掌握人工智能在测试开发领域中的应用,我们特别推出了人工智能在测试开发中的应用公开课,和大家共同探讨AI在测试开......
  • 单例模式五种实现方式以及在JDK中的体现
    单例模式五种实现方式以及在JDK中的体现一、五种实现方式1、饿汉式构造私有提供一个静态私有的成员常量,类型就是单例类型,值是用私有构造创造出来的唯一实例提供公共的静态方法获取上述的静态成员常量publicclassSingleton1implementsSerializable{//(1)构造私有......
  • xxl_job系列---【GLUE(shell)模式如何传多个参数,并被shell接收】
    1.场景我需要传入多个参数,在执行任务时传入的任务参数用逗号隔开,到shell中都被$1当做字符串接收到了,没办法,只能在shell中截取字符串,截成多个参数。2.编辑入参点击“任务管理”->“操作”->“编辑”->“任务参数”:afp,date+%Y%m,zhangsan3.编辑shell脚本点击“任务管理”->......