所谓“工厂模式”是三种常见设计模式的总称,即简单工厂模式、工厂方法模式、抽象工厂模式。本期我们将介绍抽象工厂模式以及工厂模式在Spring框架中的应用。例如,业务需要创建三种产品:口罩、防毒面具和防护服,每种产品有两种类型:高端和低端。根据工厂方法模型的解决方案,需要创建的类如下:如图所示,每个产品类对应一个工厂类。当产品数量很多的时候,工厂类的数量就会变老,变多,使得系统变得非常复杂。这个时候怎么办?先看product类的代码。口罩和防护服是两个抽象接口,有高端和低端的实现类:}}publicclassHighEndMaskimplementsIMask{@OverridepublicvoidshowMask(){System.out.println("我是高端面具");}}publicinterfaceIProtectiveSuit{voidshowSuit();}publicclassLowEndProtectiveSuitimplementsIProtectiveSuit{@OverridepublicvoidshowSuit(){System.out.println("我我是低端防护服");}}publicclassHighEndProtectiveSuitimplementsIProtectiveSuit{@OverridepublicvoidshowSuit(){System.out.println("我是高端防护服");}}然后是工厂类,因为产品是分为高端组和低端组,工厂也分为高端工厂和低端工厂,各自负责组内产品的创建:publicinterfaceIFactory{//创建maskIMaskcreateMask();//创建防护服IProtectiveSuitcreateSuit();}publicclassLowEndFactoryimplementsIFactory{@OverridepublicIMaskcreateMask(){IMaskmask=newLowEndMask();//...//LowEndMask100行初始化代码returnmask;}@OverridepublicIProtectiveSuitcreateSuit(){IProtectiveSuitsuit=newLowEndProtectiveSuit();//.....//100行LowEndProtectiveSuitreturnsuit初始化代码;}}publicclassHighEndFactoryimplementsIFactory{@OverridepublicIMaskcreateMask(){IMaskmask=newHighEndMask();//.....//100行初始化forHighEndMask代码returnmask;}@OverridepublicIProtectiveSuitcreateSuit(){IProtectiveSuitsuit=newHighEndProtectiveSuit();//.....//HighEndProtectiveSuit的100行初始化代码returnsuit;}}最后客户端代码,通过实例化不同的工厂子类,调用不同的创建方法可以创建不同的产品:publicclassTest{publicstaticvoidmain(String[]args){IFactoryfactoryA=newLowEndFactory();IFactoryfactoryB=newHighEndFactory();//创建低端maskIMaskmaskA=factoryA.createMask();//创建高-endmaskIMaskmaskB=factoryB.createMask();//创建低端防护服IProtectiveSuitsuitA=factoryA.createSuit();//创建高端防护服IProtectiveSuitsuitB=factoryB.createSuit();maskA.showMask();maskB.showMask();suitA.showSuit();suitB.showSuit();}}简单工厂模式:简单工厂模式有一个独特的工厂类,工厂类的创建方法根据传入的参数决定最后创建什么同一个产品对象工厂方法模式:工厂方法模式通过多个工厂类实现工厂接口,利用多态性创建不同的产品对象,从而避免冗长的if-else条件判断。抽象工厂模式:抽象工厂模式将产品子类分组,同一组中的不同产品由同一个工厂子类的不同方法创建,从而减少工厂子类的数量。熟悉spring框架的朋友一定知道spring的一个重要特性:依赖注入(DI)。通过Spring的依赖注入,开发者不需要在业务代码中手动实例化bean对象,也不需要了解任何工厂类。bean对象从创建到销毁的整个过程完全由spring容器管理。用户需要做的就是在xml配置文件中设置bean的属性(或者使用注解):根据上面的配置,spring容器会动态的创建一个UserController对象,并创建一个UserController所依赖的UserService对象.如果开发者想将bean对象userService的实现类替换成其他类,不需要改动任何代码,只需要修改配置文件中对应bean的class属性即可。大多数情况下,我们使用new关键字来创建对象,对象所属的类在代码中定义的很清楚。但在少数情况下,我们需要在程序运行过程中使用类的元信息(如完整的类名)动态创建对象,这就使用了Java反射。当我们在spring配置文件中配置对应的bean并启动项目时,spring会为我们解析xml配置文件,根据bean生命周期的不同从spring内部的“工厂”中创建bean对象。对spring依赖注入原理感兴趣的朋友可以阅读spring源码中的BeanFactory接口及相关实现类。本文转载自微信公众号“程序员小灰”,可通过以下二维码关注。转载本文请联系程序员小灰公众号。
