【设计模式】抽象工厂模式(Abstract Factory Pattern)

目录标题

  • 抽象工厂设计模式详解
    • 1. 介绍
    • 2. 结构
    • 3. 实现步骤
      • 3.1 创建抽象产品接口
      • 3.2 创建具体产品类
      • 3.3 创建抽象工厂接口
      • 3.4 创建具体工厂类
    • 4. 好处与优点
    • 5. 坏处与缺点
    • 6. 适用场景
    • 7. 总结

抽象工厂设计模式详解

1. 介绍

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的接口,而无需指定它们具体的类。抽象工厂模式与工厂方法模式相比,不仅仅是针对单一产品的创建,而是针对产品族的创建,即相关联的产品组合。

2. 结构

抽象工厂模式的主要结构包括以下几个角色:

  • 抽象工厂(AbstractFactory):声明一组用于创建一系列产品对象的方法,每个方法对应一个具体产品组合。
  • 具体工厂(ConcreteFactory):实现抽象工厂接口,负责创建具体产品对象。
  • 抽象产品(AbstractProduct):声明一组产品对象的接口。
  • 具体产品(ConcreteProduct):实现抽象产品接口,是工厂方法模式中具体创建的对象。

3. 实现步骤

下面以一个简单的示例来说明抽象工厂模式的实现过程,假设我们有两种类型的产品族:形状(Shape)和颜色(Color),每种产品族有对应的两种具体产品。

3.1 创建抽象产品接口

// Shape.java
public interface Shape {
    void draw();
}

// Color.java
public interface Color {
    void fill();
}

3.2 创建具体产品类

// Circle.java
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个圆形");
    }
}

// Square.java
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个正方形");
    }
}

// Red.java
public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("填充红色");
    }
}

// Blue.java
public class Blue implements Color {
    @Override
    public void fill() {
        System.out.println("填充蓝色");
    }
}

3.3 创建抽象工厂接口

// AbstractFactory.java
public interface AbstractFactory {
    Shape createShape();
    Color createColor();
}

3.4 创建具体工厂类

// ShapeFactory.java
public class ShapeFactory implements AbstractFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }

    @Override
    public Color createColor() {
        return new Red();
    }
}

// ColorFactory.java
public class ColorFactory implements AbstractFactory {
    @Override
    public Shape createShape() {
        return new Square();
    }

    @Override
    public Color createColor() {
        return new Blue();
    }
}

3.5 客户端使用

// Client.java
public class Client {
    public static void main(String[] args) {
        AbstractFactory shapeFactory = new ShapeFactory();
        Shape shape = shapeFactory.createShape();
        Color color = shapeFactory.createColor();
        shape.draw();
        color.fill();
        
        AbstractFactory colorFactory = new ColorFactory();
        Shape shape2 = colorFactory.createShape();
        Color color2 = colorFactory.createColor();
        shape2.draw();
        color2.fill();
    }
}

4. 好处与优点

  • 产品族一致性:抽象工厂模式能够确保所创建的产品都属于同一产品族,保证了产品之间的兼容性。
  • 易于替换:由于具体工厂负责创建一整个产品族,所以可以轻松地替换整个产品族,而无需修改客户端代码。
  • 符合单一职责原则:每个具体工厂只负责创建一种产品族,符合单一职责原则。

5. 坏处与缺点

难以扩展新的产品族:抽象工厂模式在增加新的产品族时,需要修改抽象工厂接口及所有具体工厂类,对系统的扩展性有一定影响。

增加了系统复杂度:引入了更多的类和接口,增加了系统的复杂度,适用于较复杂的场景。

6. 适用场景

抽象工厂模式适用于以下场景:

  • 需要创建一系列相关或依赖对象的产品族,并希望这些产品族之间保持一致性。
  • 系统有多个产品族,但每次只使用其中一个产品族。
  • 客户端不依赖于产品的创建细节,只关心产品的接口。

7. 总结

抽象工厂模式是一种常见且实用的设计模式,通过提供一组相关产品的创建接口,保证了产品族的一致性,同时也降低了客户端与具体产品的耦合度。在设计系统时,根据具体需求选择合适的设计模式能够提高代码的可维护性和可扩展性。

在这里插入图片描述

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

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

相关文章

Kimichat使用技巧:方便又实用的kimi+智能体

今天kimi智能助手推出了kimi的功能。简单的说,就是一系列kimi已经写好的提示词,用户可以直接调用、对话。 Kimi分为官方推荐、办公提效、辅助写作、社交娱乐、生活实用这几类。可以从左边侧边栏点击进入。 官方推荐的有: Kimi 001号小客服&…

c语言——二叉树

目录 目录 二叉树关键概念理解 一颗拥有1000个结点的树度为4,则它的最小深度是? 那么对于二叉树,只掌握这些是远远不够的,我们还需要掌握几个最基本的经典问题, 求二叉树大小 求叶子结点个数 求深度 求第k层的…

多线程编程9——线程池

一、为什么要引入线程池? 虽然对比进程,线程已经很轻量了,创建销毁调度线程都更高效。但是随着并发程度的提高,我们对于性能要求的标准也越来越高,当我们需要频繁创建销毁调度线程时,就发现线程也没有那么…

【基础算法】二分查找

1.二分查找 二分查找 思路&#xff1a; 朴素二分模版 class Solution { public:int search(vector<int>& nums, int target) {int l 0, r nums.size() - 1;while(l < r){int mid (l r) / 2;if(nums[mid] < target) l mid 1;else if(nums[mid] > ta…

综合性练习(后端代码练习1)——加法计算器

目录 一、准备工作 二、约定前后端交互接口 1、概念介绍 2、需求分析 3、接口定义 请求参数 响应数据 三、服务器代码 四、前端页面代码 五、运行测试 遇到问题如何解决&#xff1f; 需求&#xff1a;输入两个整数&#xff0c;点击 “点击相加” 按钮&#xff0c;显…

JAVA顺序表相关习题1

1.笔试题:cvte str1 :welcome to cvte str2:come 描述:删除第一个字符串当中出现的所有的第二个字符串的字符!结果:wlt vt 要求 用ArrayList完成! public class Test {public static List<Character> findSameWords(String u1, String u2){List<Character> listn…

前端请求没问题,后端正常运行,但查不出数据

写代码时写得快了些&#xff0c;Orders.的订单状态写错了CONFIRMED 改成COMPLETED

二、再识VUE-MVVM

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 MVVM Vue.js 专注于 MVVM 模型的 ViewModel 层。它通过双向数据绑定把 View 层和 Model 层连接了起来。实际的 DOM 封装和输出格式都被抽象为了 Directives 和 Filters。 ViewModel 一个同步 Model 和 View 的对象。在 Vue.js…

汇川AM400PLC编码器转速测量功能块(M法测速)

M法测速的原理和相关代码,大家可以参考相关专栏文章,常用链接如下: 1、编码器M法测速仿真 编码器M法测速仿真(Simulink)_mt法测速 simulink-CSDN博客文章浏览阅读2k次。编码器M法和T法测速的详细讲解可以参看下面的文章链接,这里不再赘述,这里主要介绍Simulink里建模仿真…

(06)vite与ts的结合

文章目录 系列全集package.json在根目录创建 tsconfig.json 文件在根目录创建 vite.config.ts 文件index.html额外的类型声明 系列全集 &#xff08;01&#xff09;vite 从启动服务器开始 &#xff08;02&#xff09;vite环境变量配置 &#xff08;03&#xff09;vite 处理 c…

详细介绍如何使用YOLOv9 在医疗数据集上进行实例分割-含源码+数据集下载

深度学习彻底改变了医学图像分析。通过识别医学图像中的复杂模式,它可以帮助我们解释有关生物系统的重要见解。因此,如果您希望利用深度学习进行医疗诊断,本文可以成为在医疗数据集上微调YOLOv9 实例分割的良好起点。 实例分割模型不是简单地将区域分类为属于特定细胞类型,…

新质生产力实践,我用chatgpt开发网站

是的&#xff0c;我用chatgpt开发了一个网站&#xff0c;很轻松。 我之前一点不懂前端&#xff0c;也没有网站开发的代码基础&#xff0c;纯正的0基础。 从0开始到最后成品上线&#xff0c;时间总计起来大致一共花了2-3周的时间。 初始想法我是想给我公司开发一个网站&#…

3月8日是星期六

突然有查询特殊条件日期的需求。 <html> <title>3月8日是星期六</title> <center> <h1 id"h1"></h1> <div id"div"></div> </center> <script> var weekday [星期日, 星期一, 星期二, 星期…

Eclipse:-Dmaven.multiModuleProjectDirectory system propery is not set.

eclipse中使用maven插件的时候&#xff0c;运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match. 可以设一个环境变量M2_HOME指向你的maven安装目录 M2_HOMED:\Apps\…

echarts开发技巧

tooltip 提示框组件相关的行为&#xff0c;必须引入提示框组件后才能使用。 tooltip: {trigger: axis,axisPointer: {type: cross,label: {backgroundColor: #6a7985,},},//为弹出层的value值增加百分号valueFormatter: function (value) {return value %}, }, tooltip.axi…

碳课堂|快速了解标准要点:ISO 14064-1

为了提高企业组织碳排放报告信誉度&#xff0c;国际标准化组织&#xff08;ISO&#xff09;发布了ISO14064 标准&#xff08;全称&#xff1a;《ISO 14064-1组织层次上对温室气体排放和清除的量化和报告的规范及指南》&#xff09;&#xff0c;报告中详细规定了公司温室气体清单…

确定性最大似然(DML)估计测角

1. 最大似然函数 贝叶斯方法是基于统计理论的一种经典方法&#xff0c;适合于有关参数估计问题。最大似然 (Maximum Likelihood&#xff0c;ML) 估计方法就是贝叶斯估计方法的一种特例&#xff0c;是在已知高斯噪声情况下的贝叶斯最优估计。在ML算法中&#xff0c;观测所得信号…

品牌出海新篇章:独立站构建与流量转化策略

在当今数字化时代&#xff0c;品牌出海已成为许多企业拓展国际市场的重要途径之一。在这个过程中&#xff0c;构建一个高效、专业的独立站&#xff0c;成为了品牌出海的重要一环。独立站不仅有助于企业塑造独特的品牌形象&#xff0c;更能通过精准的营销策略提高流量和转化率&a…

乘用车整车太阳光模拟加速老化试验太阳光模拟器

1.阳光模拟试验介绍 太阳辐射会对室外停放的汽车内外饰件产生热效应和光化学效应&#xff0c;影响汽车内外饰件的外观、性能&#xff0c;对汽车质产生不利影响。按照汽车产环境试验标准的要求&#xff0c;汽车在研制定型之前应进行太阳辐射试验&#xff0c;以考虑其对太阳辐射环…

微服务之分布式理论zookeeper概述

一、分布式技术相关的理论 CAP理论 CAP定理(CAP theorem)&#xff0c;⼜被称作布鲁尔定理(Eric Brewer)&#xff0c;1998年第⼀次提出. 最初提出是指分布式数据存储不可能同时提供以下三种保证中的两种以上: (1) ⼀致性(Consistency): 每次读取收到的信息都是最新的; (2) …