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

【设计模式】-工厂模式(简单工厂、工厂方法、抽象工厂)

工厂模式(简单工厂、工厂方法、抽象工厂)

介绍

简单工厂模式

简单工厂模式不属于23种GoF设计模式之一,但它是一种常见的设计模式。它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化推迟到子类。

  • 优点:允许客户端通过一个共同的接口来创建对象,隐藏了实例化的过程。

  • 缺点:新增产品时需要修改工厂代码违反开闭原则

  • 框架应用
    JDBCDriverManager根据数据库 URL 返回对应的 Connection 对象

工厂方法模式(Factory Method Pattern)

工厂方法模式定义了一个用于创建对象的接口,但是让子类决定实例化哪个类。工厂方法使得一个类的实例化延迟到其子类。

  • 优点:符合开闭原则,可以在不修改工厂的情况下增加新的产品。

  • 缺点:每增加一种产品,就需要增加相应的具体工厂类,增加了系统的复杂度
    简单工厂模式相比于工厂方法模式比较简单,管理不太复杂,所以在很多项目中也不会完全设计原则编写代码,很多地方还是采用了简单工厂模式

  • 框架应用
    SpringBeanFactory:通过 ApplicationContext(子类)动态创建和管理 Bean
    MyBatisSqlSessionFactory负责创建SqlSession实例,这里的SqlSessionFactory就是一个典型的工厂角色。

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式提供了一组接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类。它是工厂方法模式的进一步扩展。

  • 优点:可以很容易地在一组相关的产品中切换实现(产品族)。
  • 缺点:当产品族中加入新产品时,所有工厂类都需要修改(在产品族数量长期稳定的时候建议使用)。

代码实现

简单工厂模式

在这个例子中,我们将创建一个简单的工厂用于生成不同品牌的汽车实例。

// 汽车接口
interface Car {void drive();
}// 宝马汽车
class BMW implements Car {public void drive() {System.out.println("Driving a BMW.");}
}// 奔驰汽车
class Mercedes implements Car {public void drive() {System.out.println("Driving a Mercedes.");}
}// 简单汽车工厂
class SimpleCarFactory {public static Car createCar(String type) {if ("BMW".equalsIgnoreCase(type)) {return new BMW();} else if ("Mercedes".equalsIgnoreCase(type)) {return new Mercedes();}return null;}
}// 客户端代码
public class SimpleFactoryDemo {public static void main(String[] args) {Car car = SimpleCarFactory.createCar("BMW");if (car != null) {car.drive();}}
}
类图

在这里插入图片描述

工厂方法模式

这里,我们将使用工厂方法模式,每个具体的工厂负责创建特定类型的汽车。

// 汽车接口
interface Car {void drive();
}// 宝马汽车
class BMW implements Car {public void drive() {System.out.println("Driving a BMW.");}
}// 奔驰汽车
class Mercedes implements Car {public void drive() {System.out.println("Driving a Mercedes.");}
}// 抽象工厂接口
interface CarFactory {Car createCar();
}// 宝马工厂
class BMWFactory implements CarFactory {public Car createCar() {return new BMW();}
}// 奔驰工厂
class MercedesFactory implements CarFactory {public Car createCar() {return new Mercedes();}
}// 客户端代码
public class FactoryMethodDemo {public static void main(String[] args) {CarFactory factory = new BMWFactory();Car car = factory.createCar();car.drive();}
}
类图

在这里插入图片描述

抽象工厂模式

在抽象工厂模式的例子中,我们将创建一个家族的产品(比如汽车及其配件)。

// 抽象产品A - 车身
interface Body {void design();
}// 具体车身A1 - 宝马车身
class BMWBody implements Body {public void design() {System.out.println("Designing BMW body.");}
}// 具体车身A2 - 奔驰车身
class MercedesBody implements Body {public void design() {System.out.println("Designing Mercedes body.");}
}// 抽象产品B - 引擎
interface Engine {void build();
}// 具体引擎B1 - 宝马引擎
class BMWEngine implements Engine {public void build() {System.out.println("Building BMW engine.");}
}// 具体引擎B2 - 奔驰引擎
class MercedesEngine implements Engine {public void build() {System.out.println("Building Mercedes engine.");}
}// 抽象工厂
interface CarFactory {Body createBody();Engine createEngine();
}// 宝马工厂
class BMWFactory implements CarFactory {public Body createBody() { return new BMWBody(); }public Engine createEngine() { return new BMWEngine(); }
}// 奔驰工厂
class MercedesFactory implements CarFactory {public Body createBody() { return new MercedesBody(); }public Engine createEngine() { return new MercedesEngine(); }
}// 客户端代码
public class AbstractFactoryDemo {public static void main(String[] args) {CarFactory factory = new BMWFactory();Body body = factory.createBody();Engine engine = factory.createEngine();body.design();engine.build();}
}
类图

在这里插入图片描述
上述代码展现了如何使用不同的设计模式来创建宝马和奔驰品牌的汽车。每种模式都有其独特的应用场景,可以根据具体需求选择最合适的模式。

http://www.lryc.cn/news/537462.html

相关文章:

  • AMESim中批处理功能的应用
  • 《Spring实战》(第6版)第1章 Spring起步
  • E卷-特殊的加密算法-(200分)
  • QT 异步编程之多线程
  • K-均值(K-means)
  • AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐
  • 接入 SSL 认证配置:满足等保最佳实践
  • 微软AutoGen高级功能——Selector Group Chat
  • w206基于Spring Boot的农商对接系统的设计与实现
  • Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
  • 深度求索—DeepSeek API的简单调用(Java)
  • flv实时监控视频
  • 有哪些免费的SEO软件优化工具
  • 跟着ai辅助学习vue3
  • 什么是Mustache
  • C++,STL容器适配器,priority_queue:优先队列深入解析
  • 1.综述 Google 的软件工程读书笔记
  • vue框架生命周期详细解析
  • 复杂电磁环境下无人机自主导航增强技术研究报告——地磁匹配与多源数据融合方法,附matlab代码
  • 蓝桥杯---排序数组(leetcode第912题)
  • 考研高数复习规范
  • Stable diffusion只换衣服的方法
  • 无人机航迹规划: 梦境优化算法(Dream Optimization Algorithm,DOA)求解无人机路径规划MATLAB
  • LlamaFactory可视化模型微调-Deepseek模型微调+CUDA Toolkit+cuDNN安装
  • 算法12-贪心算法
  • js实现点击音频实现播放功能
  • matlab平面波展开法计算的二维声子晶体带隙
  • Spring Boot (maven)分页3.0版本 通用版
  • 解决DeepSeek服务器繁忙问题
  • 小项目第一天