工厂模式:设计模式--工厂模式-****博客
策略模式:设计模式--策略模式-****博客
如果想具体了解工厂模式和策略模式,请移步上述博客~
工厂模式与策略模式是两种常见的设计模式,这两种设计模式有几点较相似:
封装性:
- 工厂模式:封装了对象的创建过程,客户端只需与工厂交互,而不需了解具体的类。
- 策略模式:封装了算法或行为的实现,客户端通过上下文对象使用策略,但不需了解具体的策略实现细节。
解耦:
- 工厂模式:通过工厂方法解耦了对象的创建与使用,客户端不需要知道具体的类,只需知道工厂接口。
- 策略模式:通过策略接口解耦了算法的使用与具体实现,客户端可以通过上下文对象使用不同的策略而无需了解具体的算法。
可扩展性:
- 工厂模式:添加新的产品只需扩展工厂类或工厂方法,而不需要修改客户端代码。
- 策略模式:添加新的策略只需实现策略接口并在上下文中使用新的策略,而不需要修改客户端代码。
虽然工厂模式和策略模式是两种常见的设计模式,但是它们在设计目的和使用方式上有明显的区别。
1. 目的
-
工厂模式:创建型模式,主要目的是创建对象。它通过工厂方法或工厂类来封装对象的创建过程,使得客户端代码可以在不需要知道具体类的情况下创建对象。工厂模式关注的是如何创建对象,而不是对象的行为。
-
策略模式:行为型模式,主要目的是定义一系列算法或行为,并将每一个算法或行为封装在一个独立的策略类中,使得算法可以相互替换。策略模式关注的是算法或行为的选择和切换,而不是对象的创建。
2. 结构
-
工厂模式:
- 简单工厂模式:一个工厂类根据提供的信息决定创建哪个具体产品类的实例。
- 工厂方法模式:定义一个创建对象的接口,由子类决定实例化哪个具体类。工厂方法模式通过子类化来创建对象。
- 抽象工厂模式:提供一个接口,用于创建一系列相关或依赖的对象,而无需指定具体类。
-
策略模式:
- 策略接口:定义一个公共的算法接口。
- 具体策略类:实现策略接口的具体算法。
- 上下文:持有一个策略对象的引用,并调用策略对象的方法来完成某种功能。
3. 使用场景
-
工厂模式:适用于需要创建多个实例且这些实例具有相同的接口但不同的实现时。例如,在构建系统中,根据配置文件动态创建不同类型的对象(如图形、数据库连接等)。
-
策略模式:适用于需要在运行时动态选择算法或行为时。例如,根据不同的业务需求选择不同的折扣策略、排序算法等。
4. 实现
-
工厂模式:
- 通过工厂类(或工厂方法)来创建对象。
- 客户端代码不需要知道具体的类名,只需知道工厂的接口或方法即可。
- 通过不同的工厂类或方法创建不同的具体产品对象。
-
策略模式:
- 通过定义策略接口和多个具体策略类来实现。
- 上下文类持有一个策略对象的引用,并委托策略对象执行具体的算法或行为。
- 可以在运行时切换策略来改变算法的行为。
5.解决问题
- 工厂模式:创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
- 策略模式:是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。
工厂模式相当于黑盒子,策略模式相当于白盒子;