视频连接:B站审核中……
1定义
工厂方法模式是一种常用的类创建型设计模式,此模式的核心思想是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
2模式简介
工厂方法(Factory Method)模式是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
它的核心结构有四个角色,分别是:
抽象工厂:工厂方法模式的核心,提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
【图1】工厂方法模式结构图
3实例实现
计算器,有基本的加、减、乘、除,四个功能。
运用简单工厂模式,类图如下:
工厂类实现:
Class operationFactory { Public static Operation createOperate(string operate) { Operation oper = null; Switch (operate) { Case “+”: Oper = new OperationAdd(); break; Case “-”: Oper = new OperationSub(); break; Case “*”: Oper = new OperationMul); break; Case “/”: Oper = new OperationDiv(); break; } } }
客户端的应用:
Operation oper; oper = operationFactory. createOperate(“+”); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult();
如果此时要增加一个“求M数的N次方”的功能,是一定需要给运算工厂类的方法里加”Case” 的分支条件的,修改原有的类。这就等于说,不但对扩展开放了,对修改也开放了,这样就违背了开闭原则。
于是工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式类图如下:
先构建一个工厂接口:
Interface IFactory { Operation CreateOperation(); }
再各建立一个具体工厂实现接口:
class AddFactory: IFactory //加法类工厂 { Public Operation CreateOperation(); { Return new OperationAdd(); } } class SubFactory: IFactory //减法类工厂 { Public Operation CreateOperation(); { Return new OperationSub(); } } class MulFactory: IFactory //乘法类工厂 { Public Operation CreateOperation(); { Return new OperationMul(); } } class DivFactory: IFactory //除法类工厂 { Public Operation CreateOperation(); { Return new OperationDiv(); } }
客户端实现:
IFactory operFactory = new AddFactory(); Operation oper = operFactory.CreateOperation(); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult();
根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂,于是要增加“求M数的N次方”的功能时,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。
这样整个工厂和产品体系其实都没有修改的变化,而只是扩展的变化,这就完全符合了开封闭原则。
4简单工厂VS工厂方法
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但问题在于,如果添加新功能,就需要修改原有的类,违背开闭原则。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现“开-闭原则”,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
5作用及意义
1、 解耦:把对象的创建和使用的过程分开。
2、 可以降低代码重复。如果创建对象A的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。可以这些创建对象A的代码放到工厂里统一管理。
3、 由于创建过程都由工厂统一管理,所以发生业务逻辑变化,不需要找到所有需要创建A的地方去逐个修正,只需要在工厂里修改即可,降低维护成本。
4、 因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。
参考链接:
https://www.jianshu.com/p/50ea47e58596
https://www.cnblogs.com/wangenxian/p/10787785.html