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

Java学习----工厂方法模式

        在面向对象设计模式中,分为三大模式,其中,创建型模式用于处理对象的创建过程,而工厂模式是其中的重要组成部分。工厂方法模式和抽象工厂模式作为工厂模式的两种主要形式,在软件开发中被广泛应用,用于解耦对象的创建与使用。

        工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。​简单来说,就是将对象的创建工作交给专门的工厂类或其子类来完成,客户端只需要关注所需产品的接口,而无需知道具体的实现类。​

        工厂方法模式的核心原理是通过引入抽象工厂和具体工厂,将产品的创建过程封装起来。其结构包含以下几个关键角色:​

(1)抽象产品:定义了产品的接口,是所有具体产品的父类。​

(2)具体产品:实现了抽象产品接口,是工厂方法模式所创建的目标对象。​

(3)抽象工厂:声明了工厂方法,该方法返回一个抽象产品类型的对象。​

(4)具体工厂:实现了抽象工厂的工厂方法,根据需求创建并返回具体产品的实例。​

        客户端通过调用具体工厂的工厂方法来获取产品对象,而无需直接实例化具体产品类,从而实现了对象创建与使用的分离。​

        工厂方法模式的主要作用体现在以下几个方面:​

(1)解耦对象创建与使用:客户端不需要知道具体产品的类名,只需知道对应的工厂即可,降低了客户端与具体产品类之间的耦合度。​

(2)提高扩展性:当需要添加新的产品时,只需新增一个具体产品类和对应的具体工厂类,无需修改现有代码,符合开闭原则。​

(3)便于测试:可以通过替换具体工厂来使用不同的产品实现,方便进行单元测试。​

        工厂方法模式的优点主要有:

(1)符合开闭原则:新增产品时无需修改原有代码,只需添加新的具体产品和具体工厂。​

(2)客户端无需知道具体产品的类名,只需关注工厂和产品接口,简化了客户端的使用。​

(3)有利于代码的封装和复用,将对象创建的逻辑集中在工厂类中。​

        同样的,其也有不少缺点,例如:

(1)每增加一个具体产品,就需要增加一个对应的具体工厂类,这会导致系统中类的数量增多,增加了系统的复杂度。​

(2)客户端需要知道具体工厂的存在才能获取所需产品,在一定程度上暴露了工厂的实现。​

        以汽车生产为例,这里使用工厂方法模式演示:​

//定义抽象产品
public interface Car {void drive();
}
//定义具体产品(BMWCar、BenzCar)
public class BMWCar implements Car {@Overridepublic void drive() {System.out.println("驾驶宝马汽车");}
}public class BenzCar implements Car {@Overridepublic void drive() {System.out.println("驾驶奔驰汽车");}
}
//定义抽象工厂
public interface CarFactory {Car createCar();
}
//定义具体工厂
public class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMWCar();}
}public class BenzFactory implements CarFactory {@Overridepublic Car createCar() {return new BenzCar();}
}
//客户端使用
public class Client {public static void main(String[] args) {CarFactory bmwFactory = new BMWFactory();Car bmw = bmwFactory.createCar();bmw.drive();CarFactory benzFactory = new BenzFactory();Car benz = benzFactory.createCar();benz.drive();}
}

        工厂方法模式与抽象工厂模式的差异​主要有:

(1)产品范围不同:工厂方法模式只针对单一产品等级结构,即一个工厂只生产一种类型的产品;而抽象工厂模式针对产品族,一个工厂可以生产多个相关的产品,这些产品属于不同的产品等级结构。​

(2)工厂接口定义不同:工厂方法模式的抽象工厂只声明一个创建产品的方法;抽象工厂模式的抽象工厂声明多个创建不同产品的方法,每个方法对应一种产品。​

(3)灵活性不同:工厂方法模式在扩展新的产品时,只需新增具体产品和具体工厂,灵活性较好;抽象工厂模式扩展新的产品族方便,但扩展新的产品等级结构困难。​

(4)适用场景不同:工厂方法模式适用于需要创建单一产品,且产品可能会有不同实现的场景;抽象工厂模式适用于需要创建一系列相关产品,且这些产品构成产品族,需要保证它们之间一致性的场景。

http://www.dtcms.com/a/295718.html

相关文章:

  • 线程通信模型
  • 中国西北典型绿洲区土壤水分特征(2018-2019年)
  • [火了]-----FastGPT 插件系统架构演进:从 Monorepo 到独立生态
  • Spring MVC 统一响应格式:ResponseBodyAdvice 从浅入深
  • 快速将前端得依赖打为tar包(yarn.lock版本)并且推送至nexus私有依赖仓库(笔记)
  • 【工具变量】省市县空气流通系数数据集(1940-2025.3年)
  • Dataease2.10 前端二次开发
  • Windows 系统中 CURL 命令使用指南及常见错误解析
  • Silly Tavern 教程②:首次启动与基础设置
  • 极客大挑战2019-HTTP
  • Vulnhub Matrix-Breakout-2-Morpheus靶机攻略
  • 网络资源模板--基于Android Studio 实现的线上点餐系统
  • 【Linux基础知识系列】第六十三篇 - 文件编辑器基础:vim
  • 自己动手造轮子:如何创建JAR并通过Maven在Spring Boot中引用
  • Opencv C# 重叠 粘连 Overlap 轮廓分割 (不知道不知道)
  • Unity 进行 3D 游戏开发如何入门
  • AUTOSAR进阶图解==>AUTOSAR_SWS_BSWModeManager
  • 智慧驾驶疲劳检测算法的实时性优化
  • 深入思考【九九八十一难】的意义,试用歌曲能否解释
  • 【论文阅读50】-融合领域知识与可解释深度学习
  • 如何构建企业级 Mentor EDA 仿真平台
  • 进程调度的艺术:从概念本质到 Linux 内核实现
  • 从“各玩各的”到“无缝贴贴”:Modbus转Profinet让机器人告别“信息孤岛”
  • 【自动化运维神器Ansible】Ansible常用模块之shell模块详解
  • 数据版本控制系统(Oxen)
  • Terraform与Ansible的关系
  • Mysql-UDF提权
  • 家政小程序系统开发:开启智慧家政新时代
  • 详解力扣高频 SQL 50 题-1757.可回收且低脂的产品【入门】
  • 使用phpstudy极简快速安装mysql