前言:策略模式和工厂模式看着很像,经常让人混淆不清,本文将介绍这2种设计模式。
策略模式
- 定义
一个类的行为或其算法可以在运行时更改
。这种类型的设计模式属于行为型模式
- 适用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
- 模式结构
- 环境(Context):持有一个Strategy的引用
- 抽象策略(IStrategy):策略接口
- 具体策略实现(StrategyImpl):包装(实现)了相关的算法或行为
- 优缺点
优点:算法可以自由切换;避免使用多重条件判断;扩展性良好
缺点:策略类会增多;所有策略类都需要对外暴露 - 示例
策略模式代码实现 策略模式创建
工厂模式
- 定义
一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的创建与使用相分离
的特点。工厂模式属于创建型模式
- 类别
-
简单工厂模式(Simple Factory)
简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。 -
工厂方法模式(Factory Method)
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。 -
抽象工厂模式(Abstract Factory)
此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。
- 示例
三种工厂创建示例参照 工厂模式创建
策略模式与工厂模式比较
- 相似点
在模式结构上,两者很相似。都是利用接口,子类去实现(继承和多态)。 - 差异
- 用途不一样
工厂是创建型模式
,它的作用就是创建对象;
策略是行为型模式,
它的作用是让一个对象在许多行为中选择一种行为; - 关注点不一样
一个关注对象创建
一个关注行为
的封装 - 解决不同的问题
工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。