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 {@Overridepublic void paint() {System.out.println("Rendering a Windows style button.");}
}// 具体产品:Mac风格按钮
class MacButton implements Button {@Overridepublic void paint() {System.out.println("Rendering a Mac style button.");}
}// 抽象产品接口
interface Textbox {void paint();
}// 具体产品:Windows风格文本框
class WindowsTextbox implements Textbox {@Overridepublic void paint() {System.out.println("Rendering a Windows style textbox.");}
}// 具体产品:Mac风格文本框
class MacTextbox implements Textbox {@Overridepublic void paint() {System.out.println("Rendering a Mac style textbox.");}
}// 抽象工厂接口
interface GUIFactory {Button createButton();Textbox createTextbox();
}// 具体工厂:Windows风格工厂
class WindowsFactory implements GUIFactory {@Overridepublic Button createButton() {return new WindowsButton();}@Overridepublic Textbox createTextbox() {return new WindowsTextbox();}
}// 具体工厂:Mac风格工厂
class MacFactory implements GUIFactory {@Overridepublic Button createButton() {return new MacButton();}@Overridepublic 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();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

化繁为简,Python快速入门,从基础到实践的学习。

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并(拼接)字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …

【Java异常】聊聊异常可能带来的坑

一个活生生的案例 本周帮同事排查了一个问题,比较诡异的是他通过测试,并没有找到根本原因,只是发现有对应的错误日志。 但是其实并没有将堆栈信息打印出来。很难看出问题。添加了 e.printStackTrace(); get exception in exter: / by zero显…

UGC编辑器开发-代码实现物体旋转操作轴

1.视频效果: 工程百度网盘链接: 链接:https://pan.baidu.com/s/1OYkt2T3Wv_Hh0Bt7nLyR-A 提取码:1212 2.设计思路: 我们从鼠标点击的屏幕坐标打出一根射线,求出射线和旋转面的交点,交点减去原…

基于SpringBoot+Vue的办公OA系统

开发环境 IDEA JDK1.8 MySQL8.0Node14.17.0 系统简介 本系统为前后端分离项目,主要拥有两个身份登录系统,管理员可以发布公告等信息,员工登录可以申请请假等信息,系统难度适中,适合学习研究使用,具体请…

使用Java语言解决古典猴子分桃问题

一、主要思想 五只猴子分桃 第一只猴子呀 平均分成五分 挤出来多一个 多的扔入海中 拿了其中一份 来了五只猴子 均是如此操作 第五只猴子呀 还存有多少只 二、基本代码 public class MonkeyPeach {public static void main(String[] args){int n 1;int m 0;int flag1;int…

非线性约束的优化问题_序列二次规划算法代码

1. 理论部分 2. 序列二次规划算法代码及解析 3.完整代码 1.理论部分 a.约束优化问题的极值条件 库恩塔克条件(Kuhn-Tucker conditions,KT条件)是确定某点为极值点的必要条件。如果所讨论的规划是凸规划,那么库恩-塔克条件也是充分条件。 &#xff…

小白入门之安装MAVEN

重生之我在大四学JAVA 第六章 安装MAVEN 打开IDEA,配置MAVEN 打开Setting 找到上面设置的settings.xml文件地址 至此MAVEN也就安装成功了 附赠一个maven清理脚本,如果发现你的电脑maven下载不了jar,依赖爆红,可以试下下面bat脚…

【Win10安装Qt6.3】安装教程_保姆级

前言 Windows系统安装Qt4及Qt5.12之前版本和安装Qt.12之后及Qt6方法是不同的 ;因为之前的版本提供的有安装包,直接一路点击Next就Ok了。但Qt5.12版本之后,Qt公司就不再提供安装包了,不论是社区版,专业版等&#xff0c…

mysql索引合并index-merge

1.简单创建表并创建Index age sid CREATE TABLE st (id bigint(20) NOT NULL AUTO_INCREMENT,age int(11) DEFAULT NULL,name varchar(100) DEFAULT NULL,sid bigint(20) DEFAULT NULL,PRIMARY KEY (id),KEY idx_age (age),KEY idx_sid (sid) ) ENGINEInnoDB AUTO_INCREMENT8 …

图解LRU缓存

图解LRU缓存 OJ链接 介绍 LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。 双向链表按照被使用的顺序存储了这些键值对,靠近尾部的键值对是最近使用的,而靠近头部的键值对是最久未…

java SSM家庭财务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM家庭财务管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代 码和数据库,系统主要采…

阅读笔记-A Cluster Separation Measure

A Cluster Separation Measure(一种聚类分离测度) 1.这篇论文要解决什么问题?要验证一个什么科学假设? 问题是确定数据中聚类的适当数量,解决这种问题的两种方法都取决于确定指数中相对较大的变化,而不是…