设计模式之一 ————抽象工厂模式

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

8. AbstractFactory 模式

设计模式 第八章 AbstractFactory 模式

  • 8.1 所谓AbstractFactory模式是什么
  • 8.2 例子
  • 8.3 AbstractFactory 模式总结

8.1 所谓AbstractFactory模式是什么?

这一章节我们学习 AbstractFactory 模式。AbstractFactory 直译成日文是「抽象工厂」。所谓抽象工厂究竟是怎样的工厂呢?AbstractFactory 模式,提供专门实现实例的生成的类,达到必须保持一致性的一系列对象准确无误地生成这个目的。

我们拿制造「车」的代码举个例子。其中有一部分代码是向「车」对象的变量 car 中添加轮胎和方向盘。

car.addTire(new CarTire());
car.addHandle(new CarHandle());

上面的这种写法,在大多数时候没有问题。可是,也有可能发生由于程序员的不经意的失误造成意想不到的错误这种情况。比如原本要制造汽车的,却把自行车的轮胎给作为参数传递过去了。如下所示

car.addTire(new BicycleTire());
car.addHandle(new CarHandle());

在实际的汽车制造过程中,我们不会担心这样的错误,但是在程序编写的过程中我们往往会像上面那样使用了不该使用的对象。这个时候,我们预先定义一个能单独负责制造「车」所需的对象的工厂类。当需要生成轮胎、方向盘等对象的时候、我们使用这个工厂类来生成,这样就能避免上面的错误。同时、这个工厂类修改的时候、使用它的相关对象也能一股脑儿被修改。

8.2 例子

我们拿「锅式料理」的制造作为例子。锅式料理有很多种类,例如鸡肉汆锅、鸡素烧汆锅、泡菜汆锅、肉圆汆锅、鲑鱼汆锅。大体由以下的部分组成。

  • 汤
  • 主要成份(蛋白质)
  • 蔬菜
  • 其他成份

主要成份一般是指肉和鱼等含蛋白质的材料。我们把表示锅式料理的HotPot类定义成下面的样子。

public class HotPot{
                 private Pot pot;
                 private Soup soup;
                    private Protein protein;
                    private List vegetables;
                    private List otherIngredients;
                    public HotPot(Pot pot){
                                         this.pot = pot;
                    }
                    public void addSoup(Soup sopu){
                                         this.soup = soup;
                    }
                    public void addMain(Protein protein){
                                         this.protein = protein;
                    }
                    public void addVegetables(List vegetables){
                                         this.vegetables = vegetables;
                    }
                    public void addOtherIngredients(List otherIngredients){
                                         this.otherIngredients = ingredients;
                    }
}

使用的「锅」,我们用构造函数的参数来指定。「汤」,我们通过指定「AddSoup」方法的参数「Soup」来添加。在这里,我们没有定义「Soup」类,但可以把它看成是「汤」类的父类。接下来,addMain 方法,它使用 Protein 对象作为参数。Protein 类这里也没有定义,但是可以把它看成是鸡肉、牛肉、豆腐等类的父类。蔬菜,我们通过指定addVegitables 方法的List类型的参数来添加。「其他成份」我们通过指定addOtherIngredients 方法的List类型的参数来添加。

首先我们来制作鸡肉汆锅这道料理。代码如下

public class SampleClass{
                   public static void main(String args[]){
                                         HotPot hotPot = new HotPot();
                                         hotPot.addSoup(new ChickenBonesSoup()); // 鶏がらを煮込んだスープ
                                         hotPot.addMain(new Chicken());        // Main として鶏肉
                                         List vegetables[] = new ArrayList();
                                         vegetables.add(new ChineseCabbage()); // 白菜
                                         vegetables.add(new Leek());           // ねぎ
                                         vegetables.add(new Chrysanthemum());  // 春菊
                                         hotPot.addVegetables(vegetables);
                                         List otherIngredients = new ArrayList();
                                         otherIngredients.add(new Tofu());     // 豆腐
                                         hotPot.addOtherIngredients(otherIngredients);
                    }
}

这样鸡肉汆锅料理就完成了。但是,依照编程人员的不同,使用这种编程手法会导致制作成不同的鸡肉汆锅料理(向蔬菜List添加蔬菜时编程人员A添加了卷心菜,B可能添加大白菜)。基于某种理由,有些时候我们可能需要防止这种情况发生。在这种情况下,我们先准备好了专门生成鸡肉汆锅对象的类,当我们想制作鸡肉汆锅的时候用这个类生成实体对象。我们把这个类叫做MizutakiFactory类。MizutakiFactory类的代码如下

 public class MizutakiFactory{
                   public Soup getSoup(){
                                         return new ChickenBonesSoup();
                    }
                    public Protein getMain(){
                                         return new Chicken();
                    }
                    public List getVegetables(){
                                         List vegetables = new ArrayList();
                                         vegetables.add(new ChineseCabbage());
                                         vegetables.add(new Leek());
                                         vegetables.add(new Chrysanthemum);
                                         return vegetables;
                    }
                    public List getOtherIngredients(){
                                         List otherIngredients = new ArrayList();
                                         otherIngredients.add(new Tofu());
                                         return otherIngredients;
                    }
}

为了和这个类配合,我们把SampleClass类修改成如下的样子。

public class SampleClass{
                    public static void main(String args[]){
                                         HotPot hotPot = new HotPot();
                                         Factory factory = new MizutakiFactory();
                                         hotPot.addSoup(factory.getSoup());
                                         hotPot.addMain(factory.getMain());
                                         hotPot.addVegetables(factory.getVegetables());
                                         hotPot.addOtherIngredients(factory.getOthreIngredients());
                    }
}

当我们要制作鸡肉汆锅料理的时候,必须使用MizutakiFactory类,这样不管是什么人总归生成的是同一种鸡肉汆锅。也就是说,变为一种编程人员不易犯错的结构了。让我们来看看这种结构的类图吧。

クラス図1

现在虽然不是AbstractFactory模式,但是却能达到「使被利用对象保持一致」这样的要求。

由于要制作和MizutakiFactory一样的SukiyakiFactory、KimuchiFactory等,我们作成了这些类的父类Factory类。Factory类定义了以下getSoup、getMain、getVegetables、getOtherIngredients四个抽象方法。

public abstract class Factory{
                    public abstract Soup getSoup();
                    public abstract Protein getMain();
                    public abstract List getVegetables();
                    public abstract List getOtherIngredients();
}

SampleClass类的main方法中,根据赋值给参数的字符的不同,有选择性地创建实际使用的Factory类。

public class SampleClass{
                    public static void main(String args[]){
                                         HotPot hotPot = new HotPot();
                                         Factory factory = createFactory(args[0]);
                                         hotPot.addSoup(factory.getSoup());
                                         hotPot.addMain(factory.getMain());
                                         hotPot.addVegetables(factory.getVegetables());
                                         hotPot.addOtherIngredients(factory.getOthreIngredients());
                    }
                    private Factory createFactory(String str){
                                         if("泡菜汆锅".equals(str)){
                                                             return new KimuchiFactory();
                                         }else if("鸡素烧汆锅".equals(str){
                                                             return new SukiyakiFactory();
                                         }else{
                                                             return new MizutakiFactory();
                                         }
                    }
} 

main方法中,我们虽然不知道Factory实例的具体类型,但下面的处理仍然可以进行。也就是说,我们通过使用抽象的Factory类使得处理能够继续进行。像这样,就能满足「使被利用的对象群体能够自由替换」要求。下面就是这种情况的类图。

クラス図2

8.3 AbstractFactory 模式总结

例子SampleClass的main方法,在没有明确究竟使用了Factory的那一个子类的情况下,我们却得到了能够被HotPot使用的对象。例如addSoup时的factory.getSoup()。

AbstractFactory模式一般的类图如下所示。

AbstractFactory パターンの一般的なクラス図

[引用] 『Java言語で学ぶ デザインパターン入門』(結城浩 ソフトバンクパブリッシング株式会社出版 2001年)

抽象工厂模式+反射技术(抽象工厂模式+简单工厂模式) 1、抽象工厂模式+反射技术 2、抽象工厂模式+简单工厂模式 3、仅仅是抽象工厂模式 立即下载

相关推荐

Cadence Allegro 17.4学习记录开始00

Cadence Allegro 有三个版本,16.6,17.2,17.4。现在主要学习最新的版本17.4.原理图设计:OrCADPCB设计:Allegro主要用到的就下面三个图片软件:PCB Editor 17.4 是用来画PCB和元器件封装的;Padstack Editor 17.4 是用来画元器件焊盘的;Capture CIS 17.4 是用来画原理图和原理图库的。其实Cadence还有很多功能,现在计划先学习以上内容,后面熟悉了这个软件,还可以继续学习放仿真等功能。

qq_31444421的博客 7440

Java工厂模式

工厂模式是一种常用的设计模式,它可以将对象的创建和使用相分离,从而降低系统耦合度,提高系统的可扩展性。Java中工厂模式有三种实现方式:简单工厂模式、工厂方法模式和抽象工厂模式。

weixin_41917928的博客 882

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 460

Java设计模式:工厂模式——图文+代码示例(通俗易懂)

每一种设计模式都有它要解决的问题

m0_59679869的博客 1986

DeepSeek Harness实战:从零构建插件化AI Agent

AI Agent开发正从硬编码走向框架化组织,插件化架构成为提升工程效率的关键。在构建可复用、可扩展的智能体系统时,开发团队需要一套能够统一管理模型调用、工具注册与上下文组装的基础设施。DeepSeek Harness作为面向Agent工程的插件化框架,通过Harness、DeepAgent与Skill三个核心抽象,将模型、工具与技能解耦为可插拔单元,让开发者无需重复造轮子即可快速搭建具备工具调用能力的智能体。本文从环境配置到Skill插件开发,完整演示如何基于DeepSeek模型构建一个可运行的Agent

weixin_34279184的博客 445

【论文笔记】Reaching agreement in the presence of faults (EIG)

1 问题定义 2 交互一致性 3 单点故障 m=1 n=4 4 多点故障(n>=3m+1) 计算过程 m=2 n=7 5 n<3m+1不能达成协定 6 带认证的算法 7 总结 这篇论文在1980年发表,是1982年著名的拜占庭将军问题论文的前身。作者Leslie Lamport是2013图灵奖得主,两篇论文引用次数分别为5000+和2000+。该论文提出的算法现在被...

zjwreal 2994

Java设计模式(工厂模式)——工厂方法模式(完整详解,附有代码+案例)

工厂方法模式:定义一个创建对象的接口(这里的接口指的是工厂),让子类(子类 指实现工厂接口的子类)决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。

Java技术加油站的博客 1183

【气动弹性实战】基于Nastran与Patran的机翼颤振仿真:从模态分析到临界速度预测

本文详细介绍了基于Nastran与Patran的机翼颤振仿真全流程,从气动弹性问题解析、机翼建模技巧到模态分析与临界速度预测。通过实战案例展示如何利用SOL 145求解器进行颤振分析,并分享网格划分、材料属性设置等工程经验,帮助工程师有效解决飞行器设计中的气动弹性耦合问题。

weixin_33725722的博客 593

Java设计模式--工厂模式

依赖抽象原则:创建对象实例时,不要之间new类,而是把这个动作交给工厂的方法并返回。

南方嘉木的博客 2265

一步步带你用C#开发Modbus通信上位机(附完整代码与工程思路)

Modbus上位机开发指南(C#实现) 本文详细介绍使用C#开发Modbus上位机系统的全过程,覆盖RTU和TCP两种协议。内容包含:1)需求分析与技术选型(WinForms+NModbus4);2)分层架构设计(UI/业务/通信层);3)通信层核心代码实现(串口/以太网连接、数据读写);4)功能模块开发(设备管理、数据采集、远程控制)。提供可直接复用的Modbus RTU客户端代码示例,包含连接管理、线圈读写、寄存器操作等工业场景必备功能。通过系统化的开发流程,帮助开发者快速构建稳定可靠的Modbus监控

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 819

mapbox进阶,dem数据转为等高面,加载转换后的等高面到地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,使用dem数据转为等高面,加载转换后的等高面到地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 407

java反射 抽象工厂_结合Java反射用简单工厂模式改进抽象工厂模式

前一篇简单介绍了抽象工厂模式,结合Java的反射机制,可以用简单工厂模式来改进抽象工厂模式,减少类的数量,增加可维护性。UML图如下:去除IFactory、SqlserverFactory和AccessFactory三个工厂类,取而代之的是DataAccess类,用一个简单工厂模式来实现。代码示例:1. 两个表User和Department的实体类public class User {privat...

weixin_33925126的博客 254

AutoSAR配置视频讲解:简介

AutoSAR实验视频讲解:闪烁一颗LED实验【简介】 大家好,欢迎来到雪云飞星的《AutoSAR实验课的视频讲解》专栏。看过《AutoSAR入门到精通系列讲解》的朋友们应该对博主不陌生,有很多朋友加了博主的微信成为了好友,还有朋友约过线下见面,博主很高兴大家能从我的博客中获得一些收获。在专栏里博主挖了很多坑,当时也说过想要录制一个AutoSAR的配置视频教程,素材在20年初就已经录好,中间各种原因足足鸽了一年。当时因为一些技术原因只能通过博客的图文形式展示出来,现在我们剪辑了视频,请了专业的配音,希望以视

雪云飞星的博客 9652

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

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

小威的博客 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

weixin_45226668的博客 997

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

J^T的博客 2362

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

君临天下的博客 991

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

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

空 854

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

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

1106

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

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

ShuSheng007的程序人生 7077

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

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

敲代码的小小酥的博客 522

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

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

Meteors.的博客 1246

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

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

gcdqwer的博客 304

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

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

qq_40537587的博客 786

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

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

在未来等你的专栏 1126
上一篇: XML文件解析技术:SAX解析(一)
下一篇: 迪斯尼概念的黄金时代
java_user
博客等级 码龄21年 11粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值