创建型模式2.抽象工厂模式

创建型模式

  1. 工厂方法模式(Factory Method Pattern)
  2. 抽象工厂模式(Abstract Factory Pattern)
  3. 建造者模式(Builder Pattern)
  4. 原型模式(Prototype Pattern)
  5. 单例模式(Singleton Pattern)

抽象工厂模式(Abstract Factory Pattern) 是一种创建型设计模式,它提供了一种接口,用于创建一系列相关或相互依赖的对象,而不需要指定具体类。该模式的关键在于通过抽象化的工厂方法来生成具体的对象集合,确保这些对象在某一产品族内是兼容的。抽象工厂模式通常被用来处理一系列产品的创建,并且在这些产品之间需要保持一致性。

关键概念

  1. AbstractFactory(抽象工厂):定义创建一组相关对象的接口。
  2. ConcreteFactory(具体工厂):实现 AbstractFactory 接口,负责创建具体的产品对象。
  3. AbstractProduct(抽象产品):定义一类产品的接口。
  4. ConcreteProduct(具体产品):实现 AbstractProduct 接口,提供具体的产品实现。
  5. Client(客户端):通过使用 AbstractFactory 来创建产品对象,但无需关心具体工厂或产品的实现。

适用场景

  • 产品族的需求:当系统需要从多个产品系列中选择时(比如不同操作系统的UI组件),可以使用抽象工厂模式。
  • 产品之间存在依赖关系:当某些产品之间需要高度的协作,抽象工厂可以确保所有产品在同一产品族中兼容。
  • 客户端需要独立于具体产品:客户端仅通过抽象工厂接口与产品交互,不关心具体产品的实现类。

优缺点分析

优点:
  1. 符合开闭原则:客户端不需要修改代码,只需要新增一个工厂类即可扩展功能。
  2. 产品族的统一性:所有产品都来自同一个工厂,因此确保它们在同一产品族中是兼容的。
  3. 提高系统的可扩展性:可以方便地增加新的产品族(即新类型的产品),只需要添加新的具体工厂和具体产品类。
缺点:
  1. 增加系统的复杂度:需要创建多个工厂类和产品类,导致系统的复杂性增加。
  2. 扩展困难:如果需要增加一个新产品类型,可能需要修改所有的工厂类和相关代码。

假设你经营一家家具公司,你的公司生产不同风格的家具:现代风格和传统风格。每种风格的家具包含不同的类型,比如桌子、椅子等。抽象工厂模式能够帮助我们在不修改客户端代码的情况下,灵活地生产各种风格的家具。 

例子:家具工厂

1. 定义抽象产品接口

我们定义两类产品:桌子(Table)和椅子(Chair)。

// 抽象产品A(桌子)
public interface Table {
    void create();
}

// 抽象产品B(椅子)
public interface Chair {
    void create();
}
2. 定义具体产品类

每种风格的家具都有不同的实现类。例如,现代风格和传统风格的桌子和椅子会有所不同。

// 现代风格的桌子
public class ModernTable implements Table {
    @Override
    public void create() {
        System.out.println("Creating a modern table.");
    }
}

// 现代风格的椅子
public class ModernChair implements Chair {
    @Override
    public void create() {
        System.out.println("Creating a modern chair.");
    }
}

// 传统风格的桌子
public class TraditionalTable implements Table {
    @Override
    public void create() {
        System.out.println("Creating a traditional table.");
    }
}

// 传统风格的椅子
public class TraditionalChair implements Chair {
    @Override
    public void create() {
        System.out.println("Creating a traditional chair.");
    }
}

 

 

3. 定义抽象工厂接口

抽象工厂接口提供了创建家具的方法(创建桌子和椅子)。

 

// 抽象工厂接口
public interface FurnitureFactory {
    Table createTable();
    Chair createChair();
}

 

4. 定义具体工厂类

每个具体工厂类负责生产特定风格的家具。

// 现代风格的家具工厂
public class ModernFurnitureFactory implements FurnitureFactory {
    @Override
    public Table createTable() {
        return new ModernTable();
    }

    @Override
    public Chair createChair() {
        return new ModernChair();
    }
}

// 传统风格的家具工厂
public class TraditionalFurnitureFactory implements FurnitureFactory {
    @Override
    public Table createTable() {
        return new TraditionalTable();
    }

    @Override
    public Chair createChair() {
        return new TraditionalChair();
    }
}

 

5. 客户端代码

客户端通过抽象工厂来创建产品,而不需要关注具体产品的实现。

 

// 客户端代码
public class FurnitureShop {
    private Table table;
    private Chair chair;

    public FurnitureShop(FurnitureFactory factory) {
        // 使用工厂创建产品
        table = factory.createTable();
        chair = factory.createChair();
    }

    public void displayFurniture() {
        table.create();
        chair.create();
    }

    public static void main(String[] args) {
        // 假设从外部配置获取客户需求
        String style = "Modern";  // 可以是 "Modern" 或 "Traditional"

        FurnitureFactory factory;
        if (style.equals("Modern")) {
            factory = new ModernFurnitureFactory();
        } else {
            factory = new TraditionalFurnitureFactory();
        }

        FurnitureShop shop = new FurnitureShop(factory);
        shop.displayFurniture();
    }
}

总结

这个例子展示了如何通过抽象工厂模式来创建一系列相关的家具产品(桌子和椅子)。不同风格的家具由不同的工厂生产,客户端只需要依赖于抽象工厂接口来创建和使用家具,而无需关心具体的实现。这种方式提高了系统的灵活性,方便扩展新的家具风格,也避免了客户端和具体产品之间的紧耦合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/949786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习基础-支持向量机SVM

目录 基本概念和定义 1. 超平面(Hyperplane) 2. 支持向量(Support Vectors) 3. 线性可分 4. 边界 SVM算法基本思想和分类 基本思想 间隔最大化 间隔(Margin) 软边距 SVM 核函数的概念 基本概念…

TypyScript从入门到精通

TypyScript从入门到精通 TypyScript 是什么?增加了什么环境搭建二、为何需要 TypeScript三、编译 TypeScript四、类型声明五、类型推断基本类型六、类型总览JavaScript 中的数据类型TypeScript 中的数据类型1. 上述所有 JavaScript 类型2. 六个新类型:3.…

mybatisX插件的使用,以及打包成配置

装mybatisX插件; idea连接数据库; 点击mybatisx-generator,设置自己装mybatisX插件; idea连接数据库; 点击mybatisx-generator,设置自己要的包和类; 如果要把自己的配置设置成一个自定义模板&a…

简单的jmeter数据请求学习

简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化,将wfms服务操作并入了workflow-server中,去除了原来的webservice服务调用形式,增加了并发处理,现在想测试模拟一下,在一…

Java后端常用的4种请求方式(通俗易懂)

文章目录 前言通用接口类(ControllerDemo)通用实体类(UserEntity)通用响应类(HttpClientResult)成功截图(先启动项目,然后右键执行main方法) HttpClientHttpClient 的主要类代码案例导入依赖工具类(HttpClientUtil)测试类 HttpURLConnection简介调用步骤代码案例导入依赖工具类…

floodfill算法_dfs

之前我们用BFS解决floodfil算法 BFS 解决 FloodFill 算法_图像渲染_岛屿数量_被围绕的区域-CSDN博客 下面我们用dfs进行解决 733. 图像渲染 从初始位置开始dfs,找和它值相同的,并在dfs过程中把值改为目标值。因为会改变原数组,不用vis记录经过…

40% 降本:多点 DMALL x StarRocks 的湖仓升级实战

小编导读: 多点 DMALL 成立于2015年,持续深耕零售业,为企业提供一站式全渠道数字零售解决方案 DMALL OS。作为 DMALL OS 数字化能力的技术底座,大数据平台历经多次迭代平稳支撑了公司 To B 业务的快速开展。随着国家产业升级和云原…

AI-Talk开发板之超拟人

一、说明 运行duomotai_ap sdk下的LLM_chat例程,实现开发板和超拟人大模型进行语音交互,支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人,如果当前SDK在v2.3.o以下,需要更新SDK。在SDK目录(duomotai_ap)下…

graylog+sidecar通过docker-compose部署并采集SSH登录日志

文章目录 前言一、graylog日志系统数据流向清洗图二、资源准备及部署1.docker-compose部署2.准备docker-compose.yml文件3.安装graylog-sidecar并配置4.给sidecar创建token 三、graylog-WEB配置采集SSH日志1.配置Inputs2.创建sidecar采集器3.将页面创建好的sidecar与服务器绑定…

【Vue.js】监听器功能(EventListener)的实际应用【合集】

目录 🤔在实际开发过程中,我遇到了一个颇为棘手的小问题 😋解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决!​ 📖相关知识总结 基本概念 使用方法 实际应用场景 🤔在实际开发过程中…

2023年区块链职业技能大赛——区块链应用技术(一)模块一

模块一:区块链产品方案设计及系统运维: 任务1-1:区块链产品需求分析与方案设计 1.依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和…

【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】

目录 😋环境配置:华为HarmonyOS开发者 📺演示效果: 📖实验步骤及方法: 一、在media文件夹中添加想要使用的图片素材​ 二、在entry/src/main/ets/page目录下创建Welcome.ets文件 1. 整体结构与组件声…

Flutter Android修改应用名称、应用图片、应用启动画面

修改应用名称 打开Android Studio,打开对应项目的android文件。 选择app下面的manifests->AndroidManifest.xml文件,将android:label"bluetoothdemo2"中的bluetoothdemo2改成自己想要的名称。重新启动或者重新打包,应用的名称…

MES管理系统如何解决企业制造瓶颈

在当今全球化与信息化高度融合的时代,制造业作为支撑国家经济发展的关键产业,正处于发展的十字路口,面临着一系列严峻挑战。从日常所需的各类用品到先进的高端工业产品,制造业的稳定发展对经济的稳健运行至关重要,一旦…

Maven 详细配置:Maven settings 配置文件的详细说明

Maven settings 配置文件是 Maven 环境的重要组成部分,它用于定义用户特定的配置信息和全局设置,例如本地仓库路径、远程仓库镜像、代理服务器以及认证信息等。settings 文件分为全局配置文件(settings.xml)和用户配置文件&#x…

【C++】18.继承

文章目录 1.继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 1.3 继承类模板 2.基类和派生类对象赋值转换3.继承中的作用域3.1 隐藏规则:3.2 考察继承作用域相关选择题 4.派生类的默认成员函数4…

声音是如何产生的

一、音频概述 RTMP中一般音频采用aac编码,采样率为44100HZ, 每帧1024采样,帧率43,23.2ms一帧 RTC中一般音频采用opus编码,采样率为48000HZ,每帧480采样,帧率100,10ms一帧 通道数(c…

什么是中间件中间件有哪些

什么是中间件? 中间件(Middleware)是指在客户端和服务器之间的一层软件组件,用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件,它可以在两个系统之间传递、处理、转换数据,以达到协…

问题清除指南|关于num_classes与 BCELoss、BCEWithLogitsLoss 和 CrossEntropyLoss 的关系

前言:关于「 num_classes 1 」引发的探究。 2024年尾声,学弟问到一个问题:在研究工作 CNNDetection 的github开源代码 networks/trainer.py 文件的 line 27 self.model resnet50(num_classes1) 中,变量 num_classes 的值为1&…

FinDKG: 用于检测金融市场全球趋势的动态知识图谱与大型语言模型

“FinDKG: Dynamic Knowledge Graphs with Large Language Models for Detecting Global Trends in Financial Markets” 论文地址:https://arxiv.org/pdf/2407.10909 摘要 动态知识图(DKG)能够表示对象间随时间变化的关系,适用于…