Java--抽象工厂设计模式

抽象工厂设计模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

抽象工厂模式包含以下几个核心角色:

抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
(https://img-blog.csdnimg.cn/direct/e6b2f97b0074400bb3f5a2a70dc4d00f.png)

使用步骤
创建抽象工厂类,定义具体工厂的公共接口; 创建button、Textbox接口
创建抽象产品族类 ,定义抽象产品的公共接口; GUIFactory
创建抽象产品类 (继承抽象产品族类),定义具体产品的公共接口;WindowsButton、MacButton、WindowsTextbox、MacTextbox
创建具体产品类(继承抽象产品类) & 定义生产的具体产品;WindowsFactory,MacFactory
创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
在这里插入图片描述

package AbstractFactory;
// 抽象产品接口
interface Button {
    void paint();
}

// 具体产品:Windows风格按钮
class WindowsButton implements Button {
    @Override
    public void paint() {
        System.out.println("Rendering a Windows style button.");
    }
}

// 具体产品:Mac风格按钮
class MacButton implements Button {
    @Override
    public void paint() {
        System.out.println("Rendering a Mac style button.");
    }
}

// 抽象产品接口
interface Textbox {
    void paint();
}

// 具体产品:Windows风格文本框
class WindowsTextbox implements Textbox {
    @Override
    public void paint() {
        System.out.println("Rendering a Windows style textbox.");
    }
}

// 具体产品:Mac风格文本框
class MacTextbox implements Textbox {
    @Override
    public void paint() {
        System.out.println("Rendering a Mac style textbox.");
    }
}

// 抽象工厂接口
interface GUIFactory {
    Button createButton();
    Textbox createTextbox();
}

// 具体工厂:Windows风格工厂
class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public Textbox createTextbox() {
        return new WindowsTextbox();
    }
}

// 具体工厂:Mac风格工厂
class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public Textbox createTextbox() {
        return new MacTextbox();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 选择要使用的工厂
        // 或者 new MacFactory();
        GUIFactory factory = new WindowsFactory();

        // 创建按钮和文本框
        Button button = factory.createButton();
        Textbox textbox = factory.createTextbox();

        // 使用创建的按钮和文本框
        button.paint();
        textbox.paint();

        GUIFactory factory1 = new MacFactory();

        button = factory1.createButton();
        textbox = factory1.createTextbox();

        button.paint();
        textbox.paint();
    }
}

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

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

相关文章

考研往应届考生报名流程?

文章目录: 一:考试时间相关 二:公告查询获取信息 三:提供材料 1.基本要求 2.证件要求 四:相关问题 1.报名流程如何操作 2.考点选择 2.1 应届考生考点选择 2.2 往届考生考点选择 3.预报名时间可能不同 4.档…

Python编程 圣诞树教程 (附代码)专属于程序员的浪漫

文章目录 1.turtle库2.python函数的定义规则3.引入库4.定义画彩灯函数5.定义画圣诞树的函数6.定义树下面小装饰的函数7.定义一个画雪花的函数8.画五角星9.写文字10.全部源代码11.html圣诞树代码实现(动态音乐) 1.turtle库 turtle库是Python语言中一个很…

Java LocalDateTime转Json报错处理

在项目中LocalDateTime 进行json转换时,抛出序列化异常,查找解决方案,记录下来,方便备查。 报错信息 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time.LocalDateT…

【小白攻略】php 小数转为百分比,保留两位小数的函数

php 小数转为百分比 首先,最简单直观的方法是利用PHP内置的number_format函数。该函数可以对一个数字进行格式化,并可以设置小数点后的精度。通过将小数乘以100,再用number_format函数将结果格式化为百分比形式,即可达到将小数转为…

基于Java SSM框架实现多人试卷批改考试命题系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现多人试卷批改考试命题系统演示 摘要 多人命题系统是高校为教师、学生试卷的重要组成部分,是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。我所在学院多采用半手工管理学生试卷…

什么是动态代理?

目录 一、为什么需要代理? 二、代理长什么样? 三、Java通过什么来保证代理的样子? 四、动态代理实现案例 五、动态代理在SpringBoot中的应用 导入依赖 数据库表设计 OperateLogEntity实体类 OperateLog枚举 RecordLog注解 上下文相…

车云TCP链路偶现链接失联问题排查

一、问题分析 1.1 车云tcp长连接分析排查 在15:37:32.039上线, 在 16:07:26.527下线,车云长连接通道稳定,且该期间心跳数据正常。 1.2 云向驾仓推送数据分析 在15:37:42 进行车辆接管后,该车辆下线,且无法在上线&am…

Java语法---使用sort进行排序

目录 一、升序 二、降序 (1)类实现接口 (2)匿名内部类 三、自定义排序规则 四、集合中的sort排序 (1)升序 (2)降序 (3)自定义排序 一、升序 升序排…

vue3+Ts

安装 命令含义可参考typescript文章中的自动编译部分 npm create vitelatest vuets-project -- --template vue-tsvs code插件 Vue Language Features (Volar)对.vue文件进行实时的类型错误反馈TypeScript Vue Plugin (Volar) 用于支持在TS中import*.vue文件(mai…

08-JVM调优实战及常量池详解

文章目录 阿里巴巴Arthas详解Arthas使用场景Arthas使用 GC日志详解打印GC日志方法如何分析GC日志CMSG1 JVM参数汇总查看命令Class常量池与运行时常量池字面量符号引用 字符串常量池字符串常量池的设计思想三种字符串操作(Jdk1.7 及以上版本)字符串常量池位置字符串常量池设计原…

C语言——高精度除法

一、引子 1、引言 高精度除法相较于加减乘法更加复杂,它需要处理的因素更多,在这里我们先探讨高精度数除以低精度数,即大数除小数。这已满足日常所需,如需大数除以大数,可以使用专门的库,例如&#xff1a…

3.Redis持久化

文章目录 RDB(Redis DataBase):RDB是什么?RDB能干嘛?RDB自动触发RDB手动触发RDB优点RDB缺点什么情况会触发RDB快照 AOF(Append Only File):AOF是什么?AOF能干嘛&#xff…

【Hadoop】 YARN 运行过程/YARN设计目标

YARN 运行过程剖析YARN设计目标 YARN 运行过程剖析 一个Job在YARN中的处理过程: 客户端向RM提交一个job,进入RM中的调度器队列以供调度RM中的AppManager与NM协商协商好一个容器,以启动一个App Master实例App Master启动之后向RM注册并根据Jo…

刷题第五十一天 84. 柱状图中最大矩形

好难,看解析: # 双指针 class Solution:def largestRectangleArea(self, heights: List[int]) -> int:size len(heights)# 两个DP数列储存的均是下标indexmin_left_index [0] * sizemin_right_index [0] * sizeresult 0# 记录每个柱子的左侧第一…

量化服务器 - 后台挂载运行

服务器 - 后台运行 pip3命令被kill 在正常的pip命令后面加上 -no-cache-dir tmux 使用教程 https://codeleading.com/article/40954761108/ 如果你希望在 tmux 中后台执行一个 Python 脚本,你可以按照以下步骤操作: 启动 tmux: tmux这将会创建一个新…

Ubuntu 常用命令之 ps 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 ps命令是Linux下的一个非常重要的命令,它用于查看系统中的进程状态。ps是Process Status的缩写,可以显示系统中当前运行的进程的状态。 以下是一些常用的参数 a:显示所有进程(包括…

【机器学习】决策树

参考课程视频:https://www.icourse163.org/course/NEU-1462101162?tid1471214452 1 概述 样子: 2 分裂 2.1 分裂原则 信息增益 信息增益比 基尼指数 3 终止 & 剪枝 3.1 终止条件 无需分裂 当前节点内样本同属一类 无法分裂 当前节点内…

【数据结构】四、串

目录 一、定义 二、表示与实现 定长顺序存储 堆分配存储 链式存储 三、BF算法 四、KMP算法 1.求next数组 方法一 方法二(考试方法) 2.KMP算法实现 方法一 方法二 3.nextval 4.时间复杂度 本节最重要的就是KMP算法,其他要求不高…

融资项目——swagger2的注解

1. ApiModel与ApiModelProperty(在实体类中使用) 如上图,ApiModel加在实体类上方,用于整体描述实体类。ApiModelProperty(value"xxx",example"xxx")放于每个属性上方,用于对属性进行描述。swagger2网页上的效果如下图&am…

c++内存池项目

文章目录 一、内存池介绍二、ThreadCache实现三、CentralCache实现四、PageCache实现五、回收内存六、大于256KB的内存申请与释放七、将new和delete换为定长内存池八、多线程环境下对比malloc进行基准测试九、使用基数树进行性能优化 一、内存池介绍 二、ThreadCache实现 下面…