设计模式-工厂模式和策略模式

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)是两种常见的设计模式,它们在目的和使用场景上有显著的区别。

一:工厂模式

目的:工厂模式的主要目的是创建对象。它通过定义一个创建对象的接口,让子类决定实例化哪一个类。工厂模式使得一个类的实例化延迟到其子类。

使用场景:

  • 需要创建复杂对象,且具体的类在代码中可能会频繁变化。
  • 系统不应依赖于产品类实例如何被创建、组合和表达的细节。

假设我们有一个应用程序需要支持多种类型的日志记录(如文件日志、数据库日志、控制台日志等)。我们可以使用工厂模式来创建不同类型的日志记录器。

// 日志记录器接口

interface Logger {

void log(String message);

}

// 文件日志记录器

class FileLogger implements Logger {

@Override

public void log(String message) {

System.out.println("Logging to a file: " + message);

}

}

// 数据库日志记录器

class DatabaseLogger implements Logger {

@Override

public void log(String message) {

System.out.println("Logging to a database: " + message);

}

}

// 日志工厂

class LoggerFactory {

public static Logger getLogger(String loggerType) {

if ("file".equalsIgnoreCase(loggerType)) {

return new FileLogger();

} else if ("database".equalsIgnoreCase(loggerType)) {

return new DatabaseLogger();

} else {

throw new IllegalArgumentException("Unknown logger type");

}

}

}

// 使用工厂模式创建日志记录器

public class FactoryPatternExample {

public static void main(String\[\] args) {

Logger logger = LoggerFactory.getLogger("file");

logger.log("This is a log message.");

}

}

二:策略模式

目的:策略模式的主要目的是定义一系列算法,将每一个算法封装起来,并让它们可以互换。策略模式使得算法可以独立于使用它的客户端变化。

使用场景:

  • 需要在运行时选择不同的算法。
  • 需要在不同的情境下使用不同的业务规则。
  • 避免使用条件语句来选择不同的行为。

例子: 假设我们有一个应用程序需要对一组数字进行排序,但排序算法可能会根据用户的选择而变化。我

import java.util.Arrays;

// 排序策略接口

interface SortStrategy {

void sort(int\[\] data);

}

// 快速排序策略

class QuickSortStrategy implements SortStrategy {

@Override

public void sort(int\[\] data) {

System.out.println("Sorting using quick sort");

Arrays.sort(data); // 简化实现

}

}

// 冒泡排序策略

class BubbleSortStrategy implements SortStrategy {

@Override

public void sort(int\[\] data) {

System.out.println("Sorting using bubble sort");

// 简化实现:使用Java内置排序

Arrays.sort(data);

}

}

// 上下文类

class SortContext {

private SortStrategy strategy;

public SortContext(SortStrategy strategy) {

this.strategy = strategy;

}

public void setStrategy(SortStrategy strategy) {

this.strategy = strategy;

}

public void sort(int\[\] data) {

strategy.sort(data);

}

}

// 使用策略模式进行排序

public class StrategyPatternExample {

public static void main(String\[\] args) {

int\[\] data = {5, 3, 8, 6, 2};

SortContext context = new SortContext(new QuickSortStrategy());

context.sort(data);

System.out.println(Arrays.toString(data));

context.setStrategy(new BubbleSortStrategy());

context.sort(data);

System.out.println(Arrays.toString(data));

}

}

们可以使用策略模式来实现不同的排序算法。

总结

  • 工厂模式:通过工厂类来创建不同类型的对象,适用于需要动态决定创建哪种类型对象的场景。
  • 策略模式:通过上下文类和策略接口来选择不同的算法,适用于需要在运行时选择不同算法的场景。

这两种模式可以结合使用,例如,工厂模式可以用来创建策略对象。

相关推荐
智慧城市20302 分钟前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
博风15 小时前
8、设计模式应用举例:适配器模式:Iterator接口与Enumeration接口
设计模式·适配器模式
高晶16 小时前
ARM 嵌入式 Linux 系统 U-Boot 开发与移植实战M
设计模式·程序员
happy_baymax19 小时前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式
遇码21 小时前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
geovindu21 小时前
rust: Chain of Responsibility Pattern
开发语言·后端·设计模式·rust·责任链模式·行为模式
拆房老料1 天前
【第四部分:Agentic 智能体设计模式】15.为什么 Agent 也需要设计模式
人工智能·设计模式·ai·ai-native
geovindu1 天前
rust: Chain of Responsibility Pattern (续)
开发语言·后端·设计模式·rust·责任链模式·行为模式
Lost of 程序猿1 天前
责任链模式实战:审批流里“层层把关“的艺术
后端·设计模式·asp.net·责任链模式
希洛兔2 天前
状态模式详解:让对象随内部状态自动改变行为
java·设计模式·状态模式