登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
1
2
/ 2 页
下一页
返回列表
首页
›
业界区
›
业界
›
java 抽象工厂模式
java 抽象工厂模式
[ 复制链接 ]
杠氯
2025-6-9 08:53:26
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
抽象工厂模式(Abstract Factory Pattern):
是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。
意图:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:
主要解决接口选择的问题。
何时使用:
系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:
在一个产品族里面,定义多个产品。
关键代码:
在一个工厂里聚合多个同类产品。
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
注意事项:
产品族难扩展,产品等级易扩展。
抽象工厂模式包含以下几个核心角色:
抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
抽象工厂模式通常涉及一族相关的产品,每个具体工厂类负责创建该族中的具体产品。客户端通过使用抽象工厂接口来创建产品对象,而不需要直接使用具体产品的实现类。
===================================================================以上八股文来自 菜鸟教程,它从哪里来的不清楚 !!!!==============================================================
举个小例子:
某个产品, 需要提供多个数据库支持(抽象工厂) ,比如 mysql 、 DB2 、Oracle 等等( 即一系列具体产品) ,项目又被多个子公司使用 (各个子公司 就是 具体工厂), 各个子公司 有的用 mysql 有的用 DB2 或者两个都用 进行增删改查(某一具体产品)
大概就是这么个情况。。。。。
代码如下:
1. 创建 数据库服务 抽象工厂
public abstract class DBServerFactory {
public abstract MysqlServer createMysqlServer();
public abstract DB2Server createDB2Server();
}
复制代码
2.创建 mysql db2 是数据库 产品 接口
// mysql<br>public interface MysqlServer {
public String mysqlJdbc();
public String mysqlSelect();
public String mysqlSave();
}
复制代码
//db2
public interface DB2Server {
public String db2Jdbc();
public String db2Select();
public String db2Save();
}
复制代码
3.创建 子公司 使用 实现
//iphone 公司使用db2
public class IphoneDB2 implements DB2Server {
private final String factoryName= "Iphone";
@Override
public String db2Jdbc() {
return factoryName + " db2 jdbc://xxxxxxxxxx";
}
@Override
public String db2Select() {
return factoryName + " db2 select User ==== 11";
}
@Override
public String db2Save() {
return factoryName + " db2 insert User ==== 22";
}
}
//iphone 公司使用mysql
public class IphoneMysql implements MysqlServer {
private final String factoryName= "iphone";
@Override
public String mysqlJdbc() {
return factoryName + " mysql jdbc://xxxxxxxxxx";
}
@Override
public String mysqlSelect() {
return factoryName + " mysql select User ==== 11";
}
@Override
public String mysqlSave() {
return factoryName + " mysql insert User ==== 22";
}
}
复制代码
// kite 公司使用db2
public class KiteDB2 implements DB2Server {
private final String factoryName= "kite";
@Override
public String db2Jdbc() {
return factoryName + " db2 jdbc://xxxxxxxxxx";
}
@Override
public String db2Select() {
return factoryName + " db2 select User ==== 11";
}
@Override
public String db2Save() {
return factoryName + " db2 insert User ==== 22";
}
}
复制代码
4. 创建 子公司(子工厂)
// iPhone 子工厂<br>public class IphoneFactory extends DBServerFactory{
@Override
public MysqlServer createMysqlServer() {
return new IphoneMysql();
}
@Override
public DB2Server createDB2Server() {
return new IphoneDB2();
}
}
复制代码
// kite(子工厂)
public class KiteFactory extends DBServerFactory {
@Override
public MysqlServer createMysqlServer() {
return null;
}
@Override
public DB2Server createDB2Server() {
return new KiteDB2();
}
}
复制代码
5. 使用 main 方法
public static void main(String[] args) {
//iphone
DBServerFactory iphoneFactory = new IphoneFactory();<br> //kite
DBServerFactory kiteFactory = new KiteFactory();
MysqlServer mysqlServer = iphoneFactory.createMysqlServer();
DB2Server iphoneDB2Server = iphoneFactory.createDB2Server();<br>
DB2Server kiteDB2Server = kiteFactory.createDB2Server();
System.out.println(mysqlServer.mysqlJdbc());
System.out.println(mysqlServer.mysqlSelect());
System.out.println(mysqlServer.mysqlSave());
System.out.println(kiteDB2Server.db2Jdbc());
System.out.println(kiteDB2Server.db2Select());
System.out.println(iphoneDB2Server.db2Jdbc());
System.out.println(iphoneDB2Server.db2Select());
System.out.println(iphoneDB2Server.db2Save());
}
复制代码
6.结果
7.项目结构
==========================================收工=================================================================================
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
java
抽象
工厂
模式
相关帖子
Java 创建对象的 6 种方式 + 底层原理(面试必考)
java String为什么不可变
利用SWIG实现JAVA调用C/C++代码
Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程
Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程
Cursor 四种交互模式
公司新招了个 5 年 Java,开工第一天就被劝退了。。
Java 操作 Markdown(1)--commonmark-java 使用
类字节码:揭开Java虚拟机运行机制的神秘面纱
[AI应用框架/Java] Spring AI 应用开发指南
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
Java 创建对象的 6 种方式 + 底层原理(面试必考)
2
1012
高小雨
2026-03-05
业界
java String为什么不可变
4
891
髡芯
2026-03-05
安全
利用SWIG实现JAVA调用C/C++代码
0
452
沦嘻亟
2026-03-07
业界
Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程
1
30
官厌
2026-03-09
业界
Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程
0
28
公西颖初
2026-03-09
业界
Cursor 四种交互模式
0
1027
荦绅诵
2026-03-10
安全
公司新招了个 5 年 Java,开工第一天就被劝退了。。
0
52
士沌
2026-03-10
代码
Java 操作 Markdown(1)--commonmark-java 使用
0
366
哈梨尔
2026-03-12
业界
类字节码:揭开Java虚拟机运行机制的神秘面纱
0
199
坪钗
2026-03-13
业界
[AI应用框架/Java] Spring AI 应用开发指南
0
10
阮蓄
2026-03-20
回复
(30)
杆树
2025-10-24 00:44:50
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
谢谢分享,辛苦了
丘奕奕
2025-12-8 14:30:02
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
热心回复!
管水芸
2025-12-13 07:12:21
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢楼主提供!
系味
2025-12-14 01:45:02
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
过来提前占个楼
眺愤
2025-12-18 06:47:28
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢,下载保存了
博咱
2026-1-18 10:09:07
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,下载保存了,貌似很强大
时思美
2026-1-19 12:37:21
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
热心回复!
印萍
2026-1-21 13:55:17
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢楼主提供!
徙办
2026-1-22 22:46:09
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
懂技术并乐意极积无私分享的人越来越少。珍惜
颓哀
2026-1-24 10:23:39
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
不错,里面软件多更新就更好了
静轾
2026-1-25 08:24:11
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
东西不错很实用谢谢分享
谲脾
2026-1-25 10:03:24
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个有用。
薛小春
2026-1-29 07:47:42
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢,下载保存了
裆趾针
2026-1-29 08:41:40
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
新版吗?好像是停更了吧。
郗燕岚
2026-2-3 06:03:39
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
过来提前占个楼
万妙音
2026-2-3 06:25:45
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
热心回复!
获弃
2026-2-3 11:28:05
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
这个好,看起来很实用
峰襞副
2026-2-4 04:17:33
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
谢谢分享,试用一下
撵延兵
2026-2-7 16:20:29
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢分享,学习下。
下一页 »
1
2
/ 2 页
下一页
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
杠氯
2026-2-7 16:20:29
关注
0
粉丝关注
14
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991125
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
神泱
9522
6
韶又彤
9912
7
宋子
9878
8
荪俗
9016
9
闰咄阅
9995
10
刎唇
9995
查看更多
今日好文热榜
630
AI编程时代,35岁以上程序员将何去何从?
826
[Refactor]CPP Learn Data Day 1
0
Block Copy 的内存布局详解
613
把 Flask 搬进 ESP32,高中生自研嵌入式 We
1
渐得如意智能自动化办公平台——定义属于你
883
[AI/Agent/社交] AI Agent社交网络产品:Mo
520
C++协程入门
284
TCSSOFTDEPTCOPY.zip Can download source
800
Vue3 + Iframe 实战:打造企业级流程配置中
823
“你用AI,那我也会用AI,我还要你干什么?
621
自感痕迹论:先验意义场域与经验痕迹内外
7
一道KMP统考真题彻底讲透:nextval与滑动距
6
一道KMP统考真题彻底讲透:nextval与滑动距
741
从 Clubhouse 的崛起与陨落,看语聊房 RTC
244
老马失前蹄,竟然在数据库外键上翻车了,重
8
老马失前蹄,竟然在数据库外键上翻车了,重
6
老马失前蹄,竟然在数据库外键上翻车了,重
6
老马失前蹄,竟然在数据库外键上翻车了,重
8
老马失前蹄,竟然在数据库外键上翻车了,重
7
老马失前蹄,竟然在数据库外键上翻车了,重