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

如何选择工厂模式或策略模式:Java设计模式实践指南

目录

  1. 引言

    • 1.1 设计模式的重要性
    • 1.2 工厂模式与策略模式的概述
  2. 工厂模式

    • 2.1 工厂模式简介
    • 2.2 工厂模式的分类
      • 2.2.1 简单工厂模式
      • 2.2.2 工厂方法模式
      • 2.2.3 抽象工厂模式
    • 2.3 工厂模式的适用场景
    • 2.4 工厂模式的优缺点
    • 2.5 工厂模式的Java实现
      • 2.5.1 简单工厂模式的实现
      • 2.5.2 工厂方法模式的实现
      • 2.5.3 抽象工厂模式的实现
  3. 策略模式

    • 3.1 策略模式简介
    • 3.2 策略模式的应用场景
    • 3.3 策略模式的优缺点
    • 3.4 策略模式的Java实现

1. 引言

1.1 设计模式的重要性

在软件开发过程中,设计模式是一种成熟的解决方案,用来解决特定情境下的通用问题。对于Java开发者而言,掌握设计模式不仅能提高代码的可维护性和可扩展性,还能在设计系统架构时提供更优雅和高效的解决方案。工厂模式和策略模式是两种常用的设计模式,分别在对象创建和行为变化方面提供了有效的解决方案。

1.2 工厂模式与策略模式的概述

工厂模式主要解决的是“对象创建”的问题,而策略模式则专注于“行为变化”的管理。两者虽然在结构和用途上有很大的不同,但在一些复杂的设计中,常常会有交叉和组合使用的情况。因此,理解它们的区别和各自的适用场景,对于构建灵活和可维护的系统至关重要。


2. 工厂模式

2.1 工厂模式简介

工厂模式是一种创建型设计模式,通过将对象的实例化过程封装起来,使得客户端不需要直接依赖具体类,从而实现对象创建过程的灵活性和扩展性。它主要包含三种不同的实现形式:简单工厂模式、工厂方法模式和抽象工厂模式。

2.2 工厂模式的分类
2.2.1 简单工厂模式

简单工厂模式是一种最基础的工厂模式实现,通常被称为静态工厂方法。这种模式通过一个工厂类,根据输入条件来创建并返回不同类型的实例。简单工厂模式的优点在于易于理解和实现,但它违反了开闭原则,因为添加新产品时需要修改工厂类。

2.2.2 工厂方法模式

工厂方法模式通过定义一个接口或抽象类来创建对象,具体的对象创建由子类来实现。这样做的好处是遵循了开闭原则,使得系统更容易扩展。每个具体的工厂类都负责创建一个特定的产品实例,这样当需要增加新产品时,只需添加新的工厂类即可。

2.2.3 抽象工厂模式

抽象工厂模式扩展了工厂方法模式,它不仅可以创建一类产品,还可以创建一组相关或依赖的产品。通过定义多个工厂接口,抽象工厂模式可以生成一系列相关联的对象实例,并确保它们之间的相互兼容性。这个模式特别适合于需要生成一系列相关产品的系统。

2.3 工厂模式的适用场景

工厂模式适用于以下场景:

  • 需要创建复杂对象时,且这些对象有复杂的构建过程。
  • 系统中对象的创建需要封装在一个类中,以避免直接暴露对象的实例化细节。
  • 在系统中创建多种类型的相关对象,并希望确保它们之间的一致性。
2.4 工厂模式的优缺点

优点:

  • 提高了系统的灵活性,遵循了开闭原则。
  • 将对象的创建逻辑集中在一处,便于管理和修改。
  • 支持产品族的概念,有助于构建一系列相关对象。

缺点:

  • 增加了系统的复杂度,尤其是在工厂方法模式和抽象工厂模式中。
  • 当产品种类或创建过程较为简单时,使用工厂模式可能显得冗余。
2.5 工厂模式的Java实现
2.5.1 简单工厂模式的实现
public class SimpleFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ProductA();} else if (type.equals("B")) {return new ProductB();} else {throw new IllegalArgumentException("Unknown product type");}}
}
2.5.2 工厂方法模式的实现
public interface Factory {Product createProduct();
}public class FactoryA implements Factory {@Overridepublic Product createProduct() {return new ProductA();}
}public class FactoryB implements Factory {@Overridepublic Product createProduct() {return new ProductB();}
}
2.5.3 抽象工厂模式的实现
public interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}public class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ProductA1();}@Overridepublic ProductB createProductB() {return new ProductB1();}
}public class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ProductA2();}@Overridepublic ProductB createProductB() {return new ProductB2();}
}

3. 策略模式

3.1 策略模式简介

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使得它们可以互换使用。策略模式使得算法的变化不会影响到使用算法的客户。通过这种方式,可以在运行时动态选择和改变算法。

3.2 策略模式的应用场景

策略模式非常适用于以下情况:

  • 多个类仅在行为上有所不同,可以使用策略模式来动态选择行为。
  • 需要在运行时根据不同的条件选择不同的算法。
  • 避免使用条件语句或分支语句来选择不同的行为或算法。
3.3 策略模式的优缺点

优点:

  • 提高了算法的灵活性,允许在运行时改变算法。
  • 避免了大量的条件语句,使代码更加清晰。
  • 提供了算法的封装和独立扩展。

缺点:

  • 增加了系统的复杂性,特别是在有许多策略时。
  • 客户端必须了解策略之间的区别,以便正确选择策略。
3.4 策略模式的Java实现
public interface Strategy {void execute();
}public class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("Executing strategy A");}
}public class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("Executing strategy B");}
}public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mmdebstrap:创建 Debian 系统 chroot 环境的利器 ️
  • LeetCode138-随机链表的复制--经典OJ题
  • 视频循环存储的实现
  • 嵌入式学习笔记十三——C语言指针变量、一维数组的指针、快速排序
  • 25考研计算机组成原理复习·3.3主存储器与CPU的连接·3.4外部存储器
  • Web前端开发环境搭建
  • 后台数据库与Excel互联操作
  • 基于大数据的气象数据分析与可视化系统设计与实现【爬虫海量数据,LSTM预测】
  • SSRS rdlc报表 九 在.net core中使用RDLC报表
  • Linux 下查看 CPU 使用率
  • 达梦数据库 逻辑备份还原
  • SQL注入第一关-Less1
  • 备战秋招60天算法挑战,Day12
  • 企业数据治理之主数据治理--组织主数据
  • 学习记录第二十天
  • JavaScript 如何正确处理 Unicode 编码问题!
  • ES6 ...操作符
  • Redis中的lru算法实现
  • SpriteKit 技巧之添加背景图片
  • Swoft 源码剖析 - 代码自动更新机制
  • uva 10370 Above Average
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 简单实现一个textarea自适应高度
  • 将回调地狱按在地上摩擦的Promise
  • 开发基于以太坊智能合约的DApp
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 线上 python http server profile 实践
  • 阿里云重庆大学大数据训练营落地分享
  • ​2020 年大前端技术趋势解读
  • #HarmonyOS:基础语法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (function(){})()的分步解析
  • (pytorch进阶之路)扩散概率模型
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (三)终结任务
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (五)c52学习之旅-静态数码管
  • (转载)hibernate缓存
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 8.0 发布到 IIS
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net多线程Threading相关详解
  • .Net各种迷惑命名解释
  • .skip() 和 .only() 的使用
  • @SuppressWarnings(unchecked)代码的作用
  • @Validated和@Valid校验参数区别
  • []常用AT命令解释()
  • [000-01-018].第3节:Linux环境下ElasticSearch环境搭建
  • [023-2].第2节:SpringBoot中接收参数相关注解