登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
VIP申请
VIP网盘
网盘
联系我们
每日签到
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
java设计模式【工厂方法模式】
java设计模式【工厂方法模式】
[ 复制链接 ]
欧阳雪枫
2025-6-6 09:58:03
java设计模式【工厂方法模式】
工厂方法模式
工厂方法模式
(
FACTORY METHOD
)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。
抽象工厂角色负责定义产品的创建接口,即产品的创建过程应当被推迟到子类中实现。具体工厂角色则实现这些创建接口,并负责实际创建产品的工作。抽象产品角色是工厂方法模式的核心,它定义了一个产品的接口,但并不实现具体的产品逻辑。具体产品角色则实现这些接口并负责具体的产品逻辑。
使用工厂方法模式可以在不修改具体工厂角色的情况下引入新的产品,从而简化了系统的设计,并提高了系统的可扩展性。
优缺点
优点:
系统的可扩展性非常好。因为在添加新产品时,只需要添加新的具体工厂和具体产品,而不需要修改现有系统的代码。这样就保证了系统的可扩展性。
易于维护和管理。由于工厂方法模式将创建产品的逻辑推迟到子类中实现,因此可以更容易地进行维护和管理。子类可以在不改变父类接口的情况下添加新的特性,从而减少了系统的开销。
提高了系统的可靠性。因为在添加新产品时,只需要修改具体工厂类,而不需要修改客户端代码。这样可以减少因客户端代码变化而导致的系统崩溃的可能性。
缺点:
增加了系统的复杂度。在实现工厂方法模式时,需要引入抽象层,这样就增加了系统的抽象性和理解难度,同时也增加了实现的难度。
需要更多的代码编写。使用工厂方法模式需要编写新的具体工厂类和具体产品类,这样就会增加代码的复杂度和维护的难度。
使用场景
产品具有复杂的结构和层次关系,需要在多个子类之间共享某些共性逻辑。使用工厂方法模式可以将这些共性逻辑提取出来,作为一个独立的类进行封装,从而简化代码并提高系统的可扩展性。
系统需要提供一些通用的功能,但是这些功能可能会在不同的产品中被重复使用。使用工厂方法模式可以将这些通用功能提取出来,作为一个独立的类进行封装,从而降低系统的开发成本。
系统中需要使用组件化的设计思想,将不同的组件封装成独立的类。使用工厂方法模式可以将这些组件的创建过程推迟到子类中实现,从而简化代码并提高系统的可维护性。
系统需要支持动态添加和删除产品。使用工厂方法模式可以在不修改客户端代码的情况下动态添加和删除产品,从而提高系统的灵活性和可扩展性。
具体实现
以下以产品A,产品B为例实现工厂方法模式。
抽象工厂
抽象工厂定义产品的创建接口返回抽象产品
/**
* 抽象工厂类
*/
public interface IFactory {
/**
* 定义创建产品接口
*
* @return 抽象产品
*/
IProduct getInstance();
}
复制代码
具体工厂
具体工厂继承实现工厂实现创建产品接口返回具体的产品
产品A工厂类
/**
* @author physicx
* @date 2023/5/15 上午10:12
* @desc 产品A具体工厂类
* Created with IntelliJ IDEA
*/
public class ProductAFactory implements IFactory {
/**
* 返回具体产品
*
* @return 产品A
*/
@Override
public IProduct getInstance() {
return new ProductA();
}
}
复制代码
产品B工厂类
/**
* @author physicx
* @date 2023/5/15 上午10:18
* @desc 产品B具体工厂
* Created with IntelliJ IDEA
*/
public class ProductBFactory implements IFactory {
/**
* 返回具体产品
*
* @return 产品B
*/
@Override
public IProduct getInstance() {
return new ProductB();
}
}
复制代码
抽象产品
抽象产品接口定义产品的默认方法和各产品实现有差异的方法
/**
* 抽象产品类
*/
public interface IProduct {
/**
* 产品公共方法
*/
default void publicMethod() {
System.out.println("公共方法");
}
/**
* 各个产品有差异方法,子类具体实现
*/
void printInfo();
}
复制代码
具体产品
具体产品实现抽象产品,各个产品对方法做自己的具体实现
产品A
/**
* @author physicx
* @date 2023/5/15 上午10:13
* @desc 产品A
* Created with IntelliJ IDEA
*/
public class ProductA implements IProduct {
private final static String NAME = "产品A";
/**
* 输出产品信息
*/
@Override
public void printInfo() {
System.out.println("产品名称:" + NAME);
}
}
复制代码
产品B
/**
* @author physicx
* @date 2023/5/15 上午10:17
* @desc 产品B
* Created with IntelliJ IDEA
*/
public class ProductB implements IProduct {
private final static String NAME = "产品B";
/**
* 输出产品信息
*/
@Override
public void printInfo() {
System.out.println("产品名称:" + NAME);
}
}
复制代码
调用示例
public static void main(String[] args) {
//产品A工厂方法调用
IProduct productA = new ProductAFactory().getInstance();
productA.printInfo();
//产品工厂方法调用
IProduct productB = new ProductBFactory().getInstance();
productB.printInfo();
}
复制代码
运行结果如下:
补充说明
后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。
快捷导航设计模式简介总结单例模式详解工厂方法模式抽象工厂模式
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
java
设计模式
工厂
方法
模式
相关帖子
Java版本兼容性:JDK 21的SDK在JDK 1.8使用
Java线程池的几个常见问题
我一个写Java的,怎么就开始玩K8s和Jenkins了?!
突破层级壁垒:Java通过递归实现目录结构的扁平化解析
ORA-01720 错误及解决方法
Java 8 终于要被淘汰了!带你速通 Java 8~24 新特性 | 又能跟面试官吹牛皮了
技术面:Java并发(线程池、ForkJoinPool)
无GC的Java创新设计思路:作用域引用式自动内存管理
漏洞实战--java反序列化--用友NC UserAuthenticationServlet
技术面:Java并发(线程同步、死锁、多线程编排)
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
Java版本兼容性:JDK 21的SDK在JDK 1.8使用
0
960
庇床铍
2025-09-03
业界
Java线程池的几个常见问题
0
381
郏琼芳
2025-09-04
业界
我一个写Java的,怎么就开始玩K8s和Jenkins了?!
0
584
役魅肋
2025-09-04
安全
突破层级壁垒:Java通过递归实现目录结构的扁平化解析
0
44
愆蟠唉
2025-09-04
安全
ORA-01720 错误及解决方法
0
788
万妙音
2025-09-04
安全
Java 8 终于要被淘汰了!带你速通 Java 8~24 新特性 | 又能跟面试官吹牛皮了
0
730
任修
2025-09-05
业界
技术面:Java并发(线程池、ForkJoinPool)
0
146
揉幽递
2025-09-05
业界
无GC的Java创新设计思路:作用域引用式自动内存管理
0
865
昝梓菱
2025-09-05
安全
漏洞实战--java反序列化--用友NC UserAuthenticationServlet
0
652
锦惺
2025-09-09
业界
技术面:Java并发(线程同步、死锁、多线程编排)
0
972
丧血槌
2025-09-10
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
欧阳雪枫
2025-6-6 09:58:03
关注
0
粉丝关注
20
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多