本文节选自《设计模式就该这样学》1工厂方法模式的应用场景工厂方法模式主要适用于以下几个应用场景。(1)创建对象需要大量的重复代码。(2)客户端(应用层)不依赖产品类实例如何创建和实现等细节。(3)一个类通过它的子类指定创建哪个对象。2工厂方法模式的UML类图工厂方法模式的UML类图如下图所示。从上图可以看出,抽象工厂模式主要包括4个角色。(1)抽象工厂(Factory):是工厂方法模式的核心,与应用程序无关。在模式中创建的对象的任何工厂类都必须实现此接口。(2)具体工厂:是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,由应用程序调用创建产品对象。(3)抽象产品(Product):是工厂方法模式创建的对象的超类型,即产品对象的公共父类或公共接口。(4)具体产品:该角色实现抽象产品角色定义的接口。一个特定的产品是由一个特定的特定工厂创造出来的,它们之间往往存在着一一对应的关系。3工厂方法模式的一般写法下面是工厂方法模式的一般写法。publicclassClient{publicstaticvoidmain(String[]args){IFactoryfactory=newFactoryA();factory.makeProduct().doSomething();工厂=新工厂B();factory.makeProduct().doSomething();工厂=新工厂C();factory.makeProduct().doSomething();}//抽象工厂公共接口IFactory{IProductmakeProduct();}//生产ProductA的具体工厂类staticclassFactoryAimplementsIFactory{publicIProductmakeProduct(){returnnewProductA();}}//生产ProductB的具体工厂类staticclassFactoryBimplementsIFactory{publicIProductmakeProduct(){returnnewProductB();}}//生产ProductC的具体工厂类staticclassFactoryCimplementsIFactory{publicIProductmakeProduct(){returnnewProductC();}}//抽象产品公共接口IProduct{voiddoSomething();}//具体产品:ProductAstaticclassProductAimplementsIProduct{publicvoiddoSomething(){System.out.println("我是产品A");}}//具体产品:ProductBstaticclassProductBextendsFactoryBimplementsIProduct{publicvoiddoSomething(){System.out.println("IamProductB");}}//具体产品:ProductCstaticclassProductCimplementsIProduct{publicvoiddoSomething(){System.out.println("IamProductC");}}}4使用工厂方法模式实现产品扩展。工厂方法模式主要解决产品扩展的问题。在一个简单的工厂里,随着产品链的丰富,如果每个课程的创建逻辑不一样,工厂的职责就会越来越多,有点像万能工厂,不好维护。按照单一职责原则,继续分工负责,专人负责。Java课程由Java工厂创建,Python课程由Python工厂创建,工厂本身也是抽象出来的。首先创建ICourseFactory接口。publicinterfaceICourseFactory{ICoursecreate();}然后分别创建子工厂,JavaCourseFactory类的代码如下。导入com.tom.pattern.factory.ICourse;导入com.tom.pattern.factory.JavaCourse;公共类JavaCourseFactory实现ICourseFactory{publicICoursecreate(){returnnewJavaCourse();}}PythonCourseFactory类的代码如下。导入com.tom.pattern.factory.ICourse;导入com.tom.pattern.factory.PythonCourse;公共类PythonCourseFactory实现ICourseFactory{publicICoursecreate(){returnnewPythonCourse();}}客户端测试代码如下。publicstaticvoidmain(String[]args){ICourseFactoryfactory=newPythonCourseFactory();ICourse课程=factory.create();课程记录();工厂=新的JavaCourseFactory();课程=工厂。创建();.record();}最后看下图所示的类图。5工厂方法模式在Logback源码中的应用查看工厂方法模式在Logback中的应用,其类图如下图所示。从上图可以看出,不同的工厂已经分离出不同的日志框架,比如Substitute日志框架、NOP日志框架、Log4J日志框架,对应的Logger产品体系也是一样的,如图下图。关注微信公众号『汤姆炸弹架构』回复“设计模式”获取完整源码。【推荐】汤姆炸弹架构:30个设计模式实战案例(附源码),挑战60W年薪不是梦科技在于分享,我分享我的快乐!如果本文对您有帮助,请关注并点赞;有什么建议也可以留言或私信。您的支持是我坚持创作的动力。关注微信公众号『汤姆炸弹建筑』,获取更多技术干货!
