工厂模式和策略模式区

embedded/2024/9/23 6:23:45/

工厂模式(Factory Pattern)和策略模式(Strategy Pattern)是两种常见的设计模式,它们都用于解决不同场景下的代码组织问题。以下是它们的区别和应用场景的详细比较:

工厂模式(Factory Pattern):
工厂模式是一种创建型设计模式,主要用于对象的创建。它通过将对象的创建逻辑封装到一个工厂类中,使得客户端不必关心对象的具体创建过程,从而提高代码的可扩展性和维护性。

核心思想:定义一个接口用于创建对象,并让子类决定实例化哪一个类。工厂模式将实例化操作推迟到子类中进行。

策略模式(Strategy Pattern):

策略模式是一种行为型设计模式,它将算法、行为、或逻辑的不同实现封装成独立的策略类,并允许它们在运行时相互替换。策略模式通过将行为的具体实现分离出来,使得算法可以在不改变客户端代码的情况下动态改变。

核心思想:定义一系列算法或行为,并将它们封装到独立的策略类中,客户端可以根据需要在运行时选择合适的策略。

2.意图

工厂模式:解决对象的创建问题。通过将对象的创建封装在一个工厂中,避免客户端直接使用new关键字,使代码更具扩展性。

策略模式:解决行为的选择问题。通过将不同的行为封装为策略类,使得可以动态替换算法或行为。

3.应用场景

工厂模式的适用场景:

需要创建复杂对象时,且对象创建逻辑比较复杂。
客户端不需要知道具体的对象创建细节,只需要得到正确的对象实例。
代码中有多个具体类的创建逻辑,且未来可能会增加新的类。

策略模式的适用场景:

有多种算法、操作或行为可以互换,且可以在运行时动态选择。
需要避免使用大量if-else或switch语句来选择算法或行为。
想要将算法或行为与具体的业务逻辑分离,便于扩展和维护。

4.结构对比

工厂模式结构:
工厂类:负责创建对象的逻辑。
产品接口:定义产品对象的公共接口。
具体产品类:工厂类生产的具体产品。

策略模式结构:
上下文类:持有一个策略类的引用,并在运行时选择不同的策略执行相应的行为。
策略接口:定义不同策略类的公共接口。
具体策略类:封装具体的算法或行为。

5.代码示例
工厂模式示例

// 产品接口
interface Product {void create();
}// 具体产品类
class ConcreteProductA implements Product {public void create() {System.out.println("Product A created");}
}class ConcreteProductB implements Product {public void create() {System.out.println("Product B created");}
}// 工厂类
class ProductFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();} else {throw new IllegalArgumentException("Unknown product type");}}
}// 客户端使用
public class Client {public static void main(String[] args) {Product product = ProductFactory.createProduct("A");product.create();  // 输出: Product A created}
}

策略模式示例

// 策略接口
interface Strategy {void execute();
}// 具体策略类
class ConcreteStrategyA implements Strategy {public void execute() {System.out.println("Executing strategy A");}
}class ConcreteStrategyB implements Strategy {public void execute() {System.out.println("Executing strategy B");}
}// 上下文类
class Context {private Strategy strategy;public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}// 客户端使用
public class Client {public static void main(String[] args) {Context context = new Context();context.setStrategy(new ConcreteStrategyA());context.executeStrategy();  // 输出: Executing strategy Acontext.setStrategy(new ConcreteStrategyB());context.executeStrategy();  // 输出: Executing strategy B}
}

6.优缺点

工厂模式的优点:
解耦了对象的创建过程,便于扩展新的产品类。
提高了代码的灵活性和可维护性。

工厂模式的缺点:
可能增加代码的复杂性,尤其是涉及多个工厂类时。
难以处理非常复杂的对象创建逻辑。

策略模式的优点:
避免了大量的if-else或switch语句,使得算法选择更加灵活。
可以动态改变策略,扩展新的策略类无需修改现有代码。

策略模式的缺点:
可能导致策略类数量过多,增加代码管理的复杂性。
上下文类必须知道策略的接口,增加了客户端的复杂度。


http://www.ppmy.cn/embedded/100236.html

相关文章

MyBatis配置允许批量插入或更新数据

MyBatis配置allowMultiQueriestrue允许使用foreach标签批量插入或更新数据 执行update更新操作&#xff1a; <!-- 批量更新 --><update id"updateBatchByKey" parameterType"java.util.List"><foreach collection"list" item&q…

Python开发工具PyCharm v2024.2全新发布——新增Databricks集成

JetBrains PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 立即获取PyCharm v2024.2正式版(Q技术交流&#xff1a;786598704&…

java日常管理

JRE、JDK和JVM简述 GC 什么是GC GC&#xff08;Garbage Collection&#xff09;内存自动管理极速&#xff1a;内存垃圾自动回收技术[内存的分配和释放] 使用GC的好处 提高了软件开发的抽象度&#xff1b;程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题&am…

Redis内存淘汰

Redis内存淘汰 Redis可以存储多少数据 maxmemory配置&#xff0c;默认是注释掉的。 #maxmemory <bytes>我们可以主动配置maxmemory&#xff0c;maxmemory支持各种单位&#xff0c;默认是字节 maxmemory 1024 maxmemory 1024KB maxmemory 1024MB maxmemory 1024GB当Re…

深入解析HarmonyOS中的媒体查询及其高级用法

在移动应用开发中&#xff0c;响应式设计是一个关键要素。HarmonyOS提供了一整套媒体查询功能&#xff0c;可以让开发者根据设备类型、屏幕尺寸、方向等条件动态调整应用的布局和样式。本文将深入探讨HarmonyOS中的媒体查询功能&#xff0c;展示其高级用法&#xff0c;帮助你构…

Redis的数据结构——Hash表

Redis使用Hash表作为其底层数据结构来存储键值对。每个Redis数据库都维护着两个哈希表(Hash Table):ht[0]和ht[1],其中ht[0]是主要的哈希表,ht[1]是在进行rehash操作时使用的临时表。 Hash表的结构 Redis的哈希表由一个数组和一个链表组成。数组中的每个元素是一个指针,…

软件测试——自动化测试selenium常用函数

目录 元素的定位cssSelectorxpath函数 操作测试对象窗口切换窗口窗口设置大小窗口切换屏幕截图关闭窗口 等待强制等待隐式等待显示等待 浏览器导航弹窗警告弹窗确认弹窗提示弹窗 文件上传浏览器参数设置 元素的定位 web⾃动化测试的操作核⼼是能够找到⻚⾯对应的元素&#xff0…

SQLite 插入一行并返回主键

要插入一行数据并返回主键&#xff0c;我们可以使用 INSERT 语句和 last_insert_rowid() 函数。下面是一个示例&#xff1a; INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1, 值2, 值3); SELECT last_insert_rowid();SQL Copy 在示例中&#xff0c;我们使用 INSERT 语句将一…