当前位置: 首页 > web >正文

【设计模式】基于 Java 语言实现工厂模式

目录

一、简单工厂模式

1.1 简单工厂模式的介绍

二、工厂方法模式

2.1 工厂方法模式的介绍

2.2 工厂方法模式的基本实现

2.3 工厂方法模式的应用场景

三、抽象工厂

3.1 抽象工厂的概念

3.2 抽象工厂的基本结构

3.3 抽象工厂的基本实现

3.4 抽象工厂的应用场景

四、工厂模式的总结

4.1 工厂模式优点和缺点

4.2 工厂模式的适用场景

4.2.1 线程工厂(ThreadFactory)

4.2.2 Bean 工厂(FactoryBean)


工厂模式是一种创建型设计模式,它提供了一种封装对象实例化过程的方法,使客户端无需了解具体的实现细节即可获得所需的对象。通过定义一个用于创建对象的接口(工厂),让子类决定具体实例化哪一个产品类,从而使得代码在应对变化时更加灵活且易于扩展。

通俗地讲,工厂模式的本质就是用工厂方法,代替 new 操作创建一种实例化对象的方式。

一、简单工厂模式

1.1 简单工厂模式的介绍

简单⼯⼚模式是⼀种创建型设计模式,但并不属于23种设计模式之⼀,更多的是⼀种编程习惯。

简单⼯⼚模式的核⼼思想:将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个⼯⼚类⾥⾯。

简单⼯⼚模式的角色:

  1. 抽象产品:描述产品的通⽤⾏为,通常由一个 Java 接口或一个 Java 抽象类定义。

  2. 具体产品: 实现抽象产品接⼝或继承抽象产品类。

  3. ⼯⼚类:负责创建产品,根据传递的不同参数创建不同的产品示例。

简单⼯⼚类简化了客户端操作,客户端可以调⽤⼯⼚⽅法来获取具体产品,⽽⽆需直接与具体产品类交互,降低了耦合,但是有⼀个很⼤的问题就是不够灵活,如果需要添加新的产品,就需要修改⼯⼚类的代码。

简单工厂的缺点:单⼯⼚模式只有⼀个⼯⼚类,负责创建所有产品,如果要添加新的产品,通常需要修改⼯⼚类的代码。

二、工厂方法模式

2.1 工厂方法模式的介绍

⼯⼚⽅法模式也是⼀种创建型设计模式:⼯⼚⽅法模式引⼊了抽象⼯⼚和具体⼯⼚的概念,每个具体⼯⼚只负责创建⼀个具体产品,添加新的产品只需要添加新的⼯⼚类⽽⽆需修改原来的代码,这样就使得产品的⽣产更加灵活,⽀持扩展,符合开闭原则。

⼯⼚⽅法模式分为以下⼏个⻆⾊:

  • 抽象⼯⼚:⼀个接⼝,包含⼀个抽象的⼯⼚⽅法(⽤于创建产品对象)。

  • 具体⼯⼚:实现抽象⼯⼚接⼝,创建具体的产品。

  • 抽象产品:定义产品的接⼝。

  • 具体产品:实现抽象产品接⼝,是⼯⼚创建的对象。

2.2 工厂方法模式的基本实现

// 抽象产品
interface Shape {void draw();
}// 具体产品 - 圆形
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Circle");}
}// 具体产品 - 正⽅形
class Square implements Shape {@Overridepublic void draw() {System.out.println("Square");}
}// 抽象⼯⼚
interface ShapeFactory {Shape createShape();
}// 具体⼯⼚ - 创建圆形
class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}
// 具体⼯⼚ - 创建正⽅形
class SquareFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Square();}
}
/
http://www.xdnf.cn/news/7740.html

相关文章:

  • 第二届帕鲁杯时间折叠(TimeFold Paradox)
  • 绝缘栅双极型晶体管IGBT的结构与特点
  • 【Git】常用命令大全
  • Git的windows开发与linux开发配置
  • Dify快速上手 MCP,接入高德地图 Server 实战攻略
  • 香港科技大学物理学理学(科学计算与先进材料物理与技术)硕士招生宣讲会——深圳大学
  • 制作一款打飞机游戏52:子弹模式
  • C++显式声明explicit
  • 1G(第一代移动通信系统)详解
  • python 提交 命令到远程windows服务器并获取作业进程id
  • ABAP - SAP与企业微信集成-推送文件到企业微信
  • DeepSeek提示工程Prompt Engineering
  • multipart/* 响应是否必须使用 chunked 编码?
  • 常用UI自动化测试框架
  • 【Python训练营打卡】day31 @浙大疏锦行
  • 本征半导体与杂质半导体
  • Ubuntu操作系统里面安装Docker Compose
  • Python实战:打造一个功能完整的单位转换器(长度/温度/货币)
  • C++开发基础之理解std::condition_variable中的wait与wait_for的区别与使用场景
  • 基于springboot的个人博客系统【附源码】
  • 《苍穹外卖》SpringBoot后端开发项目核心知识点与技术栈整理(DAY10 to DAY12)
  • 【深度学习:理论篇】--一文理解Transformer
  • 若依项目集成sentinel、seata和shardingSphere
  • Day.js 基础用法全方位详解
  • 鸿蒙NEXT开发动画案例12
  • AI作曲革新:ACE-Step如何推动音乐创作走向大众
  • UE(虚幻)学习(六)插件打包在UE5.3.2下Value cannot be null的错误
  • Ubuntu 安装 Node.js 指定版本指南
  • 01-通过纯js理解数据驱动图表概念
  • window 显示驱动开发-GDI 硬件加速