应用背景: 系统中存在多种充值相关的方式,例如资讯类型充值、全字段类型充值、接口类型充值、总充值类型等,我们可以运用工厂模式在获取信息和设置信息时优化程序逻辑代码
示例:
首先设计一个父类的抽象类,里面包含创建所需对象的抽象方法,这些抽象方法就是工厂方法
注意: 如上图子类实现这些抽象方法时候,不真正由子类来实现具体功能,而是在子类方法里面做选择,选择具体的产品实现对象
产品父类:
父类通常会有使用这些产品对象实现一定的功能的方法,而且这些方法所实现的功能通常都是公共的功能,不管子类选择了何种具体的产品实现,这些方法的功能总是能正确执行
产品其中示例两个子类:
子类一:
子类二:
创建者其中两个子类实现:
子类一:
子类二:
如上: 在工厂方法模式里面,客户端要么使用Creator对象,要么使用Creator创建的对象,一般客户端不直接使用工厂方法。
客户端其一的使用示例:
根据不同的条件选择不同创建者实现方法的调用获取信息
综上优缺点:
优点:
1、可以在不知具体实现的情况下编程。 工厂模式可以让你在实现功能时候,如果需要某个产品对象,只需要使用产品的接口即可,而无需关心具体的实现。选择具体实现的任务延迟到子类去完成
2、更容易扩展对象的新版本
工厂方法给子类提供了一个挂钩,使得扩展新的对象版本变得非常容易。比如上述如果再增加另一种充值类型,只需要增加新的创建者和实现的产品类,在客户端调用时指定新的子类类型即可
缺点:
1、具体产品对象和工厂方法的耦合性
工厂模式中,工厂方法是需要创建产品对象的,也就是需要选择具体的产品对象,并创建它们的实例,因此具体产品对象和工厂方法是耦合的。
**本质: 延迟到子类来选择实现 [工厂方法本身并不会去实现产品接口,具体的产品实现是已经写好了的,工厂方法只要去选择实现就好了]
与简单工厂模式区别 --> 简单工厂是直接在工厂类里面进行"选择实现"; 而工厂方法会把这个工作延迟到子类来实现,工厂类里面使用工厂方法的地方是依赖于抽象而不是具体的实现,从而使得系统更加灵活,具有更好的可维护性和可扩展性。
** 工厂方法模式很好的体现了"依赖倒置原则" --> 不能让高层组件依赖于低层组件,而且不管高层组件还是低层组件,都应该依赖于抽象。