创建型模式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 {@Overridepublic void create() {System.out.println("Creating a modern table.");}
}// 现代风格的椅子
public class ModernChair implements Chair {@Overridepublic void create() {System.out.println("Creating a modern chair.");}
}// 传统风格的桌子
public class TraditionalTable implements Table {@Overridepublic void create() {System.out.println("Creating a traditional table.");}
}// 传统风格的椅子
public class TraditionalChair implements Chair {@Overridepublic void create() {System.out.println("Creating a traditional chair.");}
}

 

 

3. 定义抽象工厂接口

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

 

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

 

4. 定义具体工厂类

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

// 现代风格的家具工厂
public class ModernFurnitureFactory implements FurnitureFactory {@Overridepublic Table createTable() {return new ModernTable();}@Overridepublic Chair createChair() {return new ModernChair();}
}// 传统风格的家具工厂
public class TraditionalFurnitureFactory implements FurnitureFactory {@Overridepublic Table createTable() {return new TraditionalTable();}@Overridepublic 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();}
}

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:网络层知识点及习题(一)

网课资源: 湖科大教书匠 1、概述 网络层实现主机到主机的传输,主要有分组转发和路由选择两大功能 路由选择处理机得出路由表,路由表再生成转发表,从而实现分组从不同的端口转发 网络层向上层提供的两种服务:面向连接…

深入刨析数据结构之排序(上)

目录 1.内部排序 1.1概述 1.2插入排序 1.2.1其他插入排序 1.2.1.1 折半插入排序 1.2.1.2 2-路插入排序 1.3希尔排序 1.4快速排序 1.4.1起泡排序 1.4.2快速排序 1.4.2.1hoare版本 1.4.2.2挖坑版本 1.4.2.3前后指针版本 1.4.2.4优化版本 1.4.2.4.1小区间插入排序优…

卸载wps后word图标没有变成白纸恢复

这几天下载了个wps教育版,后头用完了删了 用习惯的2019图标 给兄弟我干没了??? 其他老哥说什么卸载关联重新下 ,而且还要什么撤销保存原来的备份什么,兄弟也是不得不怂了 后头就发现了这个半宝藏博主&…

huggingface 下载方法 测试ok

目录 python下载方法: 设置环境变量 ~/.bashrc 缓存目录,默认模型下载目录 安装方法: python 下载无token: python 下载带token 常见报错 登录后创建Read token 2.3 创建token 使用token登录 python下载方法&#xff1…

【网络安全技术与应用】(选修)实验8 入侵检测

参考内容:【入侵检测】window下安装snort_windows安装snort-CSDN博客 一、实验目的 深入理解入侵检测系统的原理和工作方式,熟悉入侵检测工具Snort在Windows操作系统中的安装、配置及使用方法。二、实验内容 安装WinPcap及Snort;启动Snort;自编写简单的报警规则并进行测试;…

Linux驱动开发 gpio_get_value读取输出io的电平返回值一直为0的问题

当时gpio子系统进行读取时返回必定是0 因此,首先必须使用platform驱动来管理gpio和pinctrl子系统,然后如果按照正点原子所教的设备树引脚设置为0x10B0则会导致读取到的电平值为0。 解决方法: 将设备树中的引脚设置为 pinctrl_gpioled: gpio…

CDP集成Hudi实战-spark shell

[〇]关于本文 本文主要解释spark shell操作Hudi表的案例 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]使用Spark-shell 1-配置hudi Jar包 [rootcdp73-1 ~]# for i in $(seq 1 6); do s…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象,有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据: 获取session获取数据: 请求存储: 请求获取: 数据正常打印&#xff1a…

常用LabVIEW算法及应用

在LabVIEW项目中,算法的应用是提高系统性能、实现特定功能、完成复杂任务的核心。LabVIEW作为一种图形化编程语言,允许用户通过直观的图形编程来实现各种复杂的算法。这些算法广泛应用于控制系统、数据采集、信号处理、图像处理、机器学习等领域。了解常…

AI Agent 开发共学招募 | 来 Sui 上探索自治智能的边界

Agent 一词源自拉丁语 “Agere”,意为“行动(to do)”。在大语言模型(LLM)的语境下,Agent 指的是能够感知环境、进行决策并执行任务的智能实体。 与传统的 RPA 相比,后者只能在预设的条件下执行…

安卓NDK视觉开发——手机拍照文档边缘检测实现方法与库封装

一、项目创建 创建NDK项目有两种方式,一种从新创建整个项目,一个在创建好的项目添加NDK接口。 1.创建NDK项目 创建 一个Native C项目: 选择包名、API版本与算法交互的语言: 选择C版本: 创建完之后,可…

计算机网络 —— 网络编程实操(1)(UDP)

计算机网络 —— 网络编程实操(UDP) 套接字端口套接字的定义为什么需要套接字? 套接字的分类1. 按照通信协议分类2. 按照地址族(Address Family)分类3. 按照通信模式分类 socket APIsockaddr结构 使用接口套接字初始化…

【HarmonyOS-ArkTS语言】面向对象【合集】

目录 😋环境配置:华为HarmonyOS开发者 🎯学习小目标: 📖实验步骤及方法: 1.在entry/src/main/ets/utils下创建MyClass.ets和MyConfig.ets文件​编辑 2.在MyConfig.ets中创建Interface Config 和enum l…

Excel | 空格分隔的行怎么导入excel?

准备工作:windows,一个记事本程序和微软的Excel软件。 打开记事本,选中所有内容,按CtrlA全选,然后复制(CtrlC)。 在Excel中,定位到你想粘贴的单元格,按CtrlV进行粘贴。粘贴后,你会在…

HTML 显示器纯色亮点检测工具

HTML 显示器纯色亮点检测工具 相关资源文件已经打包成html等文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Html相关程序案例,秉着开源精神的想法,望大家喜欢&#…

idea项目导入gitee 码云

1、安装gitee插件 IDEA 码云插件已由 gitosc 更名为 gitee。 1 在码云平台帮助文档http://git.mydoc.io/?t153739上介绍的很清楚,推荐前两种方法, 搜索码云插件的时候记得名字是gitee,gitosc已经搜不到了。 2、使用码云托管项目 如果之…

python学习笔记—13—while和for循环

1. while循环 (1) 代码 1. 示例 i 0 while i < 100:print(f"第{i}次循环")i 1 2. 计算从1加到100的和 i 1 sum 0 while i < 100:sum ii 1 print(f"1加到100的和是{sum}") 3. 使用while循环无限次猜测随机产生的数字&#xff0c;直到猜对&am…

计算机网络与服务器

目录 架构体系及相关知识 三层架构&#xff1a; 四层架构&#xff1a; 常见的应用的模式&#xff1a; OSI模型 分层 数据链路层 TCP/IP模型 TCP和UDP都是传输层的协议 TCP三次握手、四次次分手 URL&HTTP协议详解 网址URL 结构化 报文行 报文头 空行 报文体…

Mybatis(day09)

Mybatis基础操作 功能列表&#xff1a; 查询 根据主键ID查询 条件查询新增更新删除 根据主键ID删除 根据主键ID批量删除 准备 实施前的准备工作&#xff1a; 准备数据库表创建一个新的 springboot 工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql 驱动、…

CSS Grid 布局示例(基本布局+代码属性描述)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>CSS Grid 布局示例</title><style>.gri…