【Java 设计模式】创建者模式 之抽象工厂模式

news2025/7/9 18:52:28

抽象工厂模式

  • §1 概念
  • §2 角色
  • §3 甜品店案例
    • §3.1 类图
    • §3.2 实现
  • §4 优缺点

§1 概念

在这里插入图片描述

  • 产品族:华为既有华为手机,也有华为电脑、华为平板,华为手机、华为电脑和华为平板属于一个产品族,因为他们都是华为品牌。
  • 产品等级:有华为手机,也有苹果手机、小米手机,他们属于一个产品等级,因为他们都是手机,属于手机等级。
  • 抽象工厂模式和工厂方法模式的区别在于,工厂方法模式中的工厂创建的具体产品属于同一个产品等级,如:咖啡工厂可以制作美式咖啡、拿铁咖啡,但是不能制作甜点;而抽象工厂模式中的工厂创建的具体产品属于同一个产品族,如华为工厂只生产华为手机、华为电脑、华为平板等,不能生产苹果手机、苹果电脑等。

§2 角色

  • 抽象产品:定义产品的规范,描述产品的特性和功能,抽象工厂模式可能存在多个抽象产品,如:咖啡、甜点等。
  • 具体产品:实现或继承抽象产品的子类,如:咖啡有美式咖啡、拿铁咖啡,甜点有提拉米苏、抹茶慕斯。
  • 抽象工厂:提供创建产品的接口,可以创建不同产品等级的产品,如:甜品工厂既可以制作咖啡,也可以制作甜点。
  • 具体工厂:实现抽象工厂接口,完成对某一个产品族产品的生产,如:美式风味甜品工厂制作美式咖啡和抹茶慕斯,意大利风味甜品工厂制作拿铁咖啡和提拉米苏。

§3 甜品店案例

  • 某个甜品店,既可以出售咖啡,也可以出售甜点。

§3.1 类图

在这里插入图片描述

§3.2 实现

// 抽象产品: 咖啡
public abstract class Coffee {
    public abstract String getName();
    public void getMilk() {
        System.out.println("加牛奶");
    }
    public void addSugar() {
        System.out.println("加糖");
    }
}

// 抽象产品: 甜点
public abstract class Dessert {
    public abstract void show();
}

// 具体产品: 美式咖啡
public class AmericanCoffee extends Coffee {
    @Override
    public String getName() {
        return "美式咖啡";
    }
}

// 具体产品: 拿铁咖啡
public class LatteCoffee extends Coffee {
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

//具体产品: 提拉米苏
public class Tiramisu extends Dessert {
    @Override
    public void show() {
        System.out.println("提拉米苏");
    }
}

// 具体产品: 抹茶慕斯
public class MatchaMousse extends Dessert {
    @Override
    public void show() {
        System.out.println("抹茶慕斯");
    }
}

// 抽象工厂: 甜品工厂
public interface DessertFactory {
    Coffee createCoffee();
    Dessert createDessert();
}

// 具体工厂: 美式风味甜品工厂
public class AmericanDessertFactory implements DessertFactory {
    @Override
    public Coffee createCoffee() {
        return new AmericanCoffee();
    }

    @Override
    public Dessert createDessert() {
        return new MatchaMousse();
    }
}

// 具体工厂: 意大利风味甜品工厂
public class ItalyDessertFactory implements DessertFactory {
    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }

    @Override
    public Dessert createDessert() {
        return new Tiramisu();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        AmericanDessertFactory factory = new AmericanDessertFactory();
        Coffee coffee = factory.createCoffee();
        Dessert dessert = factory.createDessert();
        System.out.println(coffee.getName());
        dessert.show();
        // 可以根据需要创建对应的工厂,获取想要的产品
    }
}
/* 输出
美式咖啡
抹茶慕斯
*/

§4 优缺点

  • 优点:保证客户端使用的是同一个产品族的产品。
  • 缺点:当产品族种新增一种产品时,所有的工厂类都需要进行修改。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

骁龙咣咣咣三脚,再次改写格局

鱼羊 萧箫 发自 凹非寺量子位 | 公众号 QbitAI盆友们,骁龙,已经不再是以前那个骁龙了。就在大家吃瓜安卓新旗舰芯片谁家首发之际,骁龙峰会的绝对主角,却只差没把“时代变了”写在脸上:先是第一天直接挤爆AI牙膏管&…

创建Struts2项目并实现一个例子

文章目录一、创建Struts2项目二、struts2的一个例子一、创建Struts2项目 本人所用idea应用程序。以下全部内容,都是以idea为例 创建项目前,你需要下载Struts2所需要的jar包,你可以直接去官网下载,也可以点击https://pan.baidu.c…

LeetCode - 1419 数青蛙

题目来源 1419. 数青蛙 - 力扣(LeetCode) 题目描述 给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrog…

基于蜻蜓优化算法的认知无线电网络的服务质量研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

葡萄糖-聚乙二醇-牛血清白蛋白,BSA-PEG-Glucose,牛血清白蛋白-PEG-葡萄糖

葡萄糖-聚乙二醇-牛血清白蛋白,BSA-PEG-Glucose,牛血清白蛋白-PEG-葡萄糖 牛血清白蛋白(BSA),是牛血清中的一种球蛋白,包含607个氨基酸残基,分子量为66.446KDa,可以提供PEG接枝修饰葡萄糖,葡萄…

独家 | 人工智能的记忆与泛化(附链接)

作者:Manuel Brenner 翻译:陈之炎校对:赵茹萱本文约4500字,建议阅读8分钟本文为你介绍了人工智能 记忆与泛化相关知识。标签:人工智能,记忆,泛化“对不可见数据的泛化能力是机器学习的核心。”当…

测试用例设计方法之场景设计法

基本流:采用直黑线表示,是经过用例的最简单的路径(无任何差错,程序从开始直接执行到结束) 备选流:采用不同颜色表示,一个备选流可能从基本流开始,在某个特定条件下执行,…

声明变量let和const

1.let的声明 JavaScript中用var关键字来声明变量,而在ES6中,还可以使用新增的let的关键字来声明变量。与var不同的是let声明的变量只能在代码块中有效。 {let a5;var b6;console.log(a);console.log(b);} 执行结果: 能正常输出,…

178:vue+openlayers 加载多种形式Esri地图

第178个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中绘制自定义图形,利用Geojson的writeFeatures,来生成geojson格式的数据,然后使用file-saver来导出geojson。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetM…

【论文阅读】半监督时序动作检测 Semi-Supervised Action Detection

文章目录1. Learning Temporal Action Proposals With Fewer Labels (ICCV 2019)论文目的——拟解决问题贡献——创新实现流程详细方法2. Self-Supervised Learning for Semi-Supervised Temporal Action Proposal (CVPR 2021)论文目的——拟解决问题贡献——创新实现流程详细方…

微服务之间,最佳的调用方式是什么?

在微服务架构中,需要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。服务调用有两种方式,一种是RPC方式,另一种是事件驱动(Event-driven)方式,也就是发消息方式。消…

多模态实战视频生成文本:基于VGG与LSTM实现图像对应的描述文本生成任务

任务描述:本教程将帮助你利用深度学习的方法为照片等图像自动生成文字描述,图像描述是结合计算机视觉与自然语言处理的综合任务,输入一幅图像, 输出一段描述该图像的文字,这一任务要求模型可以识别图片中的物体、理解物体间的关系,并用一句自然语言表达出来。 运行环境:在…

体系结构30_同步性能问题

栅栏(barrier)同步 栅栏强制所有到达该栅栏的进程进行等待,直到全部的进程到达栅栏,然后释放全部的进程,从而形成同步。 栅栏的典型实现是要用两个旋转锁:一个用来记录到达栅栏的进程数,另一个用…

Java 对象拷贝原理剖析及最佳实践

1 前言 对象拷贝,是我们在开发过程中,绕不开的过程,既存在于 Po、Dto、Do、Vo 各个表现层数据的转换,也存在于系统交互如序列化、反序列化。 Java 对象拷贝分为深拷贝和浅拷贝,目前常用的属性拷贝工具,包…

【外卖项目实战开发二】

文章目录1、完善登录功能问题分析代码实现2、新增员工需求分析数据模型代码开发3、员工信息分页查询需求分析代码开发4、启用/禁用员工账号需求分析代码开发代码修复5、编辑员工信息需求分析代码开发1、完善登录功能 问题分析 前面我们已经完成了后台系统的员工登录功能开发&…

zabbix集群搭建分布式监控的操作步骤

作用: 分担server的集中式压力解决多机房之间的网络延迟问题环境准备: 服务器1:zabbix-server 服务器2:zabbix-proxy 服务器3:zabbix-agent 关系:zabbix-agent发送数据到代理,代理汇总数据发送…

Linux多核运行机制(SMP)

一、Linux内核兼容多处理器要求 有多个 CPU 处理器 的 系统中 , Linux 内核需要处理的问题 : 1、公平共享 : CPU 的负载 , 需要公平地共享 , 不能出现某个CPU空闲 , 造成资源浪费。 2、可设置进程 与 CPU 亲和性 : 可以为 某些类型的 进程 与 指定的 处理器设置亲和性 , 可以针…

QT:debug,打不开头文件以及qDebug和Q_CLASSINFO的使用

这个是因为链接器在给定路径上搜索不到对应的头文件,而大多数的Qt相关的头文件都集中在一个include文件夹里: 我电脑上的路径是:C:\Qt\Qt5.9.7\5.9.7\msvc2017_64\include 然后我们在项目设置里: 注意,这边要加上\*&…

【Java】Assert.assertEquals断言

Assert.assertEquals 1.概述 在开发中,我们需要测试时候,不可能把全部程序运行一次,在此我们就需要通过编写单元测试来对程序进行测试了。在 Assert 类里面有大量的静态方法,本篇的主角就是 Assert.assertEquals 这个静态方法。该…

day12_类中成员之方法

成员变量是用来存储对象的数据信息的,那么如何表示对象的行为功能呢?就要通过方法来实现 方法 概念: 方法也叫函数,是一个独立功能的定义,是一个类中最基本的功能单元。把一个功能封装为方法的目的是,可…