设计模式-抽象工厂模式

C++设计模式——Abstract Factory Pattern抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种将相关/依赖对象组合在一起创建的方式,而无需指定它们的具体类。抽象工厂模式与工厂方法模式的区别:工厂方法模式将对象的创建过程延迟到子类中,允许用户通过一个统一的接口来请求他们想要的具体产品,而无需知道产品的具体实现。在这个模式中,工厂类只负责生产同一系列的产品,但具体哪种产品由子类决定。抽象工厂模式更进一步,它提供了一个接口,用于创建一系列相关的或相互依赖的对象,而不是单一对象。 阅读详情

1.描述

抽象工厂模式、Abstract Factory Pattern。是创建型设计模式的一种,围绕一个超级工厂,来创建其他工厂。

主要解决:接口选择的问题。

使用场景:明确地知道什么情况下创建什么样的实例;为创建一组相关或相互依赖的对象提供一个接口,而且不需要指定它们的具体类。

举个栗子:暂时没想到

优点:基于工厂模式的升级版,多个工厂组合工作的时候可以用抽象工厂,是一个不错的方案。

缺点:产品族扩展困难。

源码在文末

2.代码实现

2.1.工具车产品定义

我们有一个工厂,可以生产工具车。工具车包括坦克、拖拉机、货车。在不同情况下,我们需要不同的工具车。

我们先定义一下我们的工具车

/**
 * 工具车接口
 *
 * @author 编程还未
 */
public interface ToolCar {
    /**
     * 跑起来
     */
    void run();
}

接着定义我们的产品

坦克

/**
 * 坦克
 *
 * @author 编程还未
 */
public class Tank implements ToolCar {
    /**
     * 跑起来
     */
    @Override
    public void run() {
        System.out.println("tank running");
    }
}

拖拉机

/**
 * 拖拉机
 *
 * @author 编程还未
 */
public class Tractor implements ToolCar {
    /**
     * 跑起来
     */
    @Override
    public void run() {
        System.out.println("tractor running");
    }
}

货车

/**
 * 货车
 * @author 编程还未
 */
public class Truck implements ToolCar {
    /**
     * 跑起来
     */
    @Override
    public void run() {
        System.out.println("truck running");
    }
}

2.2.颜色产品定义

我们需要为我们的工具车设置不同的颜色,以满足不同的需求。比如:树林用迷彩绿,沙漠地区用沙子黄,等等。

我们需要一个颜色接口

/**
 * 颜色接口
 *
 * @author 编程还未
 */
public interface Color {
    /**
     * 填充颜色
     */
    void fill();
}

颜色的三个实现类蓝、绿、红

/**
 * 蓝色
 *
 * @author 编程还未
 */
public class Blue implements Color {
    /**
     * 填充颜色
     */
    @Override
    public void fill() {
        System.out.println("Blue fill");
    }
}
/**
 * 绿色
 *
 * @author 编程还未
 */
public class Green implements Color {
    /**
     * 填充颜色
     */
    @Override
    public void fill() {
        System.out.println("Green fill");
    }
}
/**
 * 红色
 *
 * @author 编程还未
 */
public class Red implements Color {
    /**
     * 填充颜色
     */
    @Override
    public void fill() {
        System.out.println("red fill");
    }
}

2.3.定义工厂类

抽象工厂

/**
 * 抽象工厂类
 *
 * @author 编程还未
 */
public abstract class AbstractFactory {
    /**
     * 获取颜色
     *
     * @param type 颜色类型
     * @return 颜色
     */
    public abstract Color getColor(ColorFactory.Type type);

    /**
     * 获取工具车
     *
     * @param type 工具车类型
     * @return 工具车
     */
    public abstract ToolCar getToolCar(ToolCarFactory.Type type);

    enum Type {
        Color, ToolCar;
    }
}

颜色工厂和工具车工厂

/**
 * 颜色工厂
 * <p>
 * 可以生产:蓝色、绿色、红色
 *
 * @author 编程还未
 */
public class ColorFactory extends AbstractFactory {

    /**
     * 获取颜色
     *
     * @param type 颜色类型
     * @return 颜色
     */
    @Override
    public Color getColor(Type type) {
        if (type == null) {
            return null;
        }
        if (Type.BLUE.equals(type)) {
            return new Blue();
        }
        if (Type.GREEN.equals(type)) {
            return new Green();
        }
        if (Type.RED.equals(type)) {
            return new Red();
        }
        return null;
    }

    /**
     * 获取工具车
     *
     * @param type 工具车类型
     * @return 工具车
     */
    @Override
    public ToolCar getToolCar(ToolCarFactory.Type type) {
        return null;
    }

    public enum Type {
        BLUE, GREEN, RED;
    }
}
/**
 * 工具车工厂
 * <p>
 * 可以生产:坦克、拖拉机、货车
 *
 * @author 编程还未
 */
public class ToolCarFactory extends AbstractFactory {


    /**
     * 获取颜色
     *
     * @param type 颜色类型
     * @return 颜色
     */
    @Override
    public Color getColor(ColorFactory.Type type) {
        return null;
    }

    /**
     * 获取工具车
     *
     * @param type 工具车类型
     * @return 工具车
     */
    @Override
    public ToolCar getToolCar(Type type) {
        if (Type.TANK.equals(type)) {
            return new Tank();
        } else if (Type.TRACTOR.equals(type)) {
            return new Tractor();
        } else if (Type.TRUCK.equals(type)) {
            return new Truck();
        }
        //未知的类型返回null
        return null;

    }


    /**
     * 可以生产的类型
     */
    public enum Type {
        /**
         * 坦克
         */
        TANK,
        /**
         * 拖拉机
         */
        TRACTOR,
        /**
         * 货车
         */
        TRUCK;
    }
}

产品生产者

/**
 * 工厂生产者
 *
 * @author 编程还未
 */
public class FactoryProducer {
    /**
     * 获取子产品的工厂
     *
     * @param type 子产品类型
     * @return 子工厂
     */
    public static AbstractFactory getFactory(AbstractFactory.Type type) {
        if (AbstractFactory.Type.Color.equals(type)) {
            return new ColorFactory();
        }
        if (AbstractFactory.Type.ToolCar.equals(type)) {
            return new ToolCarFactory();
        }
        return null;
    }
}

测试抽象工厂

/**
 * 测试抽象工厂
 *
 * @author 编程还未
 */
public class TestFactory {

    public static void main(String[] args) {


        AbstractFactory colorFactory = FactoryProducer.getFactory(AbstractFactory.Type.Color);
        AbstractFactory toolCarFactory = FactoryProducer.getFactory(AbstractFactory.Type.ToolCar);

        //蓝色
        Color color1 = colorFactory.getColor(ColorFactory.Type.BLUE);
        color1.fill();

        //绿色
        Color color2 = colorFactory.getColor(ColorFactory.Type.GREEN);
        color2.fill();

        //红色
        Color color3 = colorFactory.getColor(ColorFactory.Type.RED);
        color3.fill();

        //现在有情况,需要几辆坦克
        ToolCar toolCar1 = toolCarFactory.getToolCar(ToolCarFactory.Type.TANK);
        toolCar1.run();

        //和平安定,需要拖拉机生产
        ToolCar toolCar2 = toolCarFactory.getToolCar(ToolCarFactory.Type.TRACTOR);
        toolCar2.run();

        //大丰收,需要货车运送货物
        ToolCar toolCar3 = toolCarFactory.getToolCar(ToolCarFactory.Type.TRUCK);
        toolCar3.run();
    }
}

源码下载

【愚公系列】二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

相关推荐

【主力资金密码】副图指标升级版使用技术图文案例分解,通达信软件炒股指标公式代码

(1)主力资金线在低位时,对应的副图指标显示柱线是绿色,这个阶段主力资金参与小,行情处于下跌趋势或弱势震荡。当然,如果结合主图指标【翻倍密码系统】操作,主图的两个买卖点以及K线均线变色跟踪功能,更多的技术支撑,多空更加清晰,共振做多或多头更加确定和安全。如上图标记,中档虚线是参考安全操作的一个区间划分,粉色阶段做多或持股为主,为操作增加一道安全保护。如上图,副图指标【主力资金密码】更新叠加操作区间背景,绿色阶段持币或做空,粉色阶段做多或持股。如上图,副图指标,标记的两个区间,绿色区间时做空或持币。

weixin_69760830的博客 2551

23种设计模式之抽象工厂模式(Abstract Factory Pattern)

本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

相机图像质量研究(15)常见问题总结:光学结构对成像的影响--暗角

老式相机的暗角往往比较明显,周围一圈能够明显感觉到亮度下降的很多,当然有些电源模仿手持相机的摄影效果,也能看到周围明显的亮度下降。一、

xiaoshixiu的专栏 1122

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

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

weixin_45226668的博客 997

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决 Xcode 13.2.1 运行到iOS12.x版本上崩溃报错如下:dyld: Symbol not found: ___chkstk_darwin dyld: Symbol not found: ___chkstk_darwin Referenced from: /private/var/containers/Bundle/Application/A424CEFD-51DB-450E-9D62-B8

wm9028的专栏 6563

ExpressLRS(ELRS)接收机技术全景:从历史演进、技术底层到产业生态全解析——上

ExpressLRS(ELRS)是一种由全球开源社区驱动的双向射频遥控链路协议栈,其接收机作为核心终端,承担信号接收解调、遥控指令解析、飞控数据交互与遥测回传等关键功能。自2018年问世以来,ELRS凭借极致性能、低成本、开放生态和强兼容性,从航模DIY方案发展为消费级无人机领域的事实标准,并逐步渗透工业级场景。 ELRS接收机采用模块化分层架构,支持2.4GHz和900MHz双频段,通过LoRa、FLRC、FSK多调制模式实现低延迟与远距离平衡。其核心技术包括自适应跳频抗干扰、TDD双向链路和极简数据包。

bother3000的博客 302

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

抽象工厂模式是所有形态的工厂模式中最抽象和最具一般性的一种。它适用于处理具有产品族(即一组相互关联或相互依赖的产品)的产品结构。产品族是指位于不同等级结构中的一组产品,它们之间可能存在一定的依赖或约束关系。抽象工厂模式通过定义一个接口,使得客户端可以在不必指定具体产品的情况下,创建多个产品族中的产品对象。

J^T的博客 2362

Sqlserver2012评估期已过问题解决(启动数据库服务报错1705都是同样的问题,数据库过期未激活)

一、背景: 因为之前安装sqlserver2012忘记输入序列号,如今出现评估期已过的问题,前几天忙活半天,才解决,发现网 上叙述都非常凌乱,并且仅仅有大意,有的非常难操作。所以把我操作的过程和大家交流分享: 一定要有序列号的输入。不然会有很多其它的麻烦出现: 二、问题解决: 第一步:进入SQL2012配置工具中的安装中心。 第二步:再进入左側维护选项界面,然后选择选择版本号升级。 ...

堂前燕的博客 3265

设计模式系列(六)抽象工厂模式(Abstract Factory Pattern)

设计模式系列(五)抽象工厂模式(Abstract Factory Pattern)     抽象工厂模式

君临天下的博客 991

c#上位机最强教程之环境安装

本文介绍了.NET 6开发环境的安装配置指南。主要内容包括:1)安装.NET 6 SDK和Runtime的方法及验证步骤;2)Visual Studio 2022的安装流程;3)创建第一个.NET 6控制台项目;4)项目结构解析和配置文件说明。文章还提供了实践练习和常见问题解答,帮助初学者快速搭建开发环境并运行简单程序。适用于零基础开发者,学习时间约10分钟。

飞上云层 314

基于Django+Vue3的智能目标检测系统设计与实现,Vue3前台系统+Django后台管理系统开发,Web前后端分离,YOLOv8 Web目标检测,实现图片、视频和摄像头检测等功能,全网独发

目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合 YOLOv8 与 Django + Vue3,构建一个Vue3前台系统+Django后台管理系统开发,便于用户进行目标检测的操作和展示,实现对图片、视频实时目标检测,不仅可以用于大论文的工作量展示,还可以作为毕业设计。支持更换自己模型、图片检测、实时视频检测、置信度调节和IoU参数调节。同时支持目标检测、实例分割、关键点检测等任务

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 5432

设计模式中的抽象工厂模式(Abstract Factory Pattern)

在软件开发中,经常需要创建一组相关的对象,并希望这些对象能够在不同的产品族之间互相兼容。如果直接在代码中实例化具体类,会导致代码耦合、难以扩展、违反开闭原则(OCP)。抽象工厂模式(Abstract Factory Pattern)提供了一种创建一组相关或依赖对象的接口,而无需指定它们的具体类,从而提高代码的灵活性和可维护性。本文将详细介绍抽象工厂模式的概念、应用场景,并通过 Python 代码示例展示其实现方式。

1106

Windows 11 安装 Miniforge,配置国内源

本文详细介绍了在 Windows 11 系统中安装 Miniforge 的完整流程,包括下载、安装选项设置、配置国内镜像源(如清华大学源)以加速包管理,并启用 mamba 提升依赖解析与安装速度。同时涵盖 conda 与 mamba 的基本使用验证、PowerShell 初始化及环境提示符优化,帮助用户快速搭建高效、开源、免费的 Python 科学计算环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 4504

Java设计模式 四 抽象工厂模式 (Abstract Factory Pattern)

是一种创建型设计模式,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式为产品族的创建提供了一个接口,其核心在于解决“产品族的扩展”和“客户端与具体工厂的解耦”。

空 854

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

秒懂设计模式之抽象工厂模式(Abstract Factory Pattern)

前言 人在IT江湖飘,不懂设计模式咋装逼? 三种工厂模式均为创建型模式,即讨论的是如何创建一个类的对象的问题。说到底就是以各种装逼的方式最终将一个类的对象new出来。没有什么神秘的,如果你发现你需要一个类的对象而你又不会这些装逼神器,那你就直接new好啦,爱谁谁。。。不过你也就逃脱不了永远是个小白的命运啦,过几年混不下去了就只能去卖奶茶,什么?你不想那么快就去卖奶茶,那就好好学习这些装逼神器! 定...

ShuSheng007的程序人生 7077

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

一、抽象工厂模式的由来   抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式。例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要把按钮和窗体统一切换成Linux风格的。如何统一进行调换呢?于是就有人设计出了,windows是一个工厂,生产windows的窗体和按钮,Linux是一个工厂,生产Linux的窗体和按钮,通过切换工厂,来整体切换按钮和窗体风格。 看了上面的描述,是不是感觉说了一堆废话呢?????其实抽象工厂模式是从工厂方法

敲代码的小小酥的博客 522

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

23种设计模式——抽象工厂模式(Abstract Factory Pattern)详解

本文介绍了23种设计模式之——抽象工厂模式(Abstract Factory Pattern)的说明及使用

Meteors.的博客 1246

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

动机 在了解动机之前,先回顾一下工厂方法模式: 在工厂方法模式中,工厂类都是对单一产品对象进行操作,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。 问题:如果想要一个工厂对多个产品对象进行操作,而不是只对单一产品进行操作,那么工厂方法模式就会变得很复杂,如何解决呢? 当系统所提供的工厂所需生产的具体产品并不是一个单一产品,而是多个位于不同继承结构之间的不同类型的产品组成的产品族,这时候就需要使用到抽象工厂模式。 继承结构:如一

gcdqwer的博客 304

设计模式精讲 Day 3:抽象工厂模式(Abstract Factory Pattern)

在面向对象设计中,抽象工厂模式是一种用于创建一系列相关或依赖对象的接口,而无需指定它们具体的类。它属于创建型模式,是工厂方法模式的进一步抽象和扩展。本节将围绕抽象工厂模式展开,分析其核心思想、结构组成、使用场景以及在实际项目中的价值。抽象工厂模式提供了一个接口,用于创建一组相关或相互依赖的对象,而无需指定它们的具体类。它封装了多个工厂方法,使得客户端可以统一地创建不同产品的家族。核心思想:将对象的创建逻辑封装到一个工厂接口中,客户端通过调用该接口获取产品,而不是直接实例化具体类。今天,我们深入学习了。

在未来等你的专栏 1126

设计模式三:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体实现类。在软件开发中,有时候需要根据不同的条件或环境来创建一组相关的对象。抽象工厂模式将对象的创建逻辑封装在一个抽象工厂接口中,该接口声明了一系列用于创建不同类型对象的方法。具体的工厂类实现了这个接口,每个具体工厂类负责创建一组相关的对象。

qq_40537587的博客 786

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

设计模式 抽象工厂模式(Abstract Factory Pattern) 一、简述 抽象工厂模式:定义一个创建一些列相关或相互依赖的对象接口,而无需指定它们具体的类。 对比工厂方法模式:(简历举例) 工厂方法模式是 多个工厂,一个工厂创建一个单一的产品。 抽象工厂模式是 多个工厂,一个工厂创建一些相关的产品(比如生产同一个牌子的上衣和裤子、比如生产同一系列但不同款式的衣服) 例子打包:例子打包:外链:https://wwa.lan...

Genven_Liang的博客 457

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

抽象工厂模式,顾名思义就是将工厂模式进行抽象化。 我建议在了解抽象工厂模式这个概念前,我们先了解一下工厂模式,这样会有助于您了解抽象工厂模式。 设计模式——工厂模式(Factory Pattern) 看到这里的小伙伴们,默认就是比较了解工厂模式的啦。那么其实抽象工厂模式其实就是将工厂模式生产的产品改为生产工厂。 接下来我继续借用一张图片来表明抽象工厂的概念。 ...

虚心学习,和气编码 600

JAVA23种设计模式之抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 介绍 意图 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要解决:解决接口选择的问题。 使用时机:产品有多于一个的产品族,而系统只消费其中某一族的产品。 优点

fuu123f的博客 196

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

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 ...

程序人生 297

设计模式 - 创建型 - 抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式是一种创建型设计模式,用于生成一系列相关或依赖的对象族(如不同操作系统的UI组件),而无需指定具体类。它通过抽象接口解耦客户端与产品创建过程,确保产品兼容性并支持灵活切换产品族。核心结构包括抽象工厂、具体工厂、抽象产品和具体产品四个角色。与工厂方法模式相比,抽象工厂更适用于多产品族的复杂场景,如跨平台系统、数据库兼容等。优点是高扩展性和产品一致性,缺点是新增产品类型需修改接口。典型应用包括Java AWT、Spring框架等。

csdn_tom_168的博客 877
上一篇: 设计模式-工厂模式
下一篇: 工作学习效率提升之66个工具网站
编程还未
博客等级 码龄5年 4293粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程还未

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值