文章目录什么是工厂设计模式简单工厂设计模式工厂方法设计模式抽象工厂设计模式例子1三种工厂方式总结1总结的非常好1、简单工厂模式2、工厂方法模式3、抽象工厂模式三种工厂方式总结2参考文献什么是工厂设计模式工厂设计模式用来生产对象的。背景java中万物皆对象这些对象都需要创建如果创建的时候直接new该对象就会对该对象耦合严重假如我们要更换对象所有new对象的地方都需要修改一遍这显然违背了软件设计的开闭原则。解决方法使用工厂来生产对象我们只和工厂打交道彻底和对象解耦。如果要更换对象直接在工厂里更换该对象即可达到了与对象解耦的目的。优点解耦 。分类1、简单工厂2、工厂方法3、抽象工厂简单工厂设计模式定义一个工厂方法依据传入的参数生成对应的产品对象角色1、抽象产品 抽象类/接口水果2、具体产品 具体类苹果、梨等3、具体工厂 工厂水果工厂4、产品使用者使用说明先将产品类抽象出来比如苹果和梨都属于水果抽象出来一个水果类Fruit苹果和梨就是具体的产品类然后创建一个水果工厂分别用来创建苹果和梨代码如下水果接口publicinterfaceFruit{voidwhatIm();}具体类 苹果publicclassAppleimplementsFruit{OverridepublicvoidwhatIm(){//苹果}}具体类 梨publicclassPearimplementsFruit{OverridepublicvoidwhatIm(){//梨}}具体工厂 水果工厂publicclassFruitFactory{publicFruitcreateFruit(Stringtype){if(type.equals(apple)){//生产苹果returnnewApple();}elseif(type.equals(pear)){//生产梨returnnewPear();}returnnull;}}产品使用/如何调用FruitFactorymFactorynewFruitFactory();Appleapple(Apple)mFactory.createFruit(apple);//获得苹果Pearpear(Pear)mFactory.createFruit(pear);//获得梨就这样一个非常简单的工厂设计模式就完成了。但是有没有发现什么问题呢对那就是如果我想吃香蕉想吃橘子呢我万一什么都想吃呢所以以上的这种方式每当我想添加一种水果就必然要修改工厂类这显然违反了开闭原则亦不可取。所以简单工厂只适合于产品对象较少且产品固定的需求对于产品变化无常的需求来说显然不合适所以我们来看下一种方式。工厂方法设计模式定义将工厂提取成一个接口或抽象类具体生产什么产品由子类决定。角色1、抽象产品 抽象类/接口水果2、具体产品 具体类苹果、梨等3、抽象工厂 抽象类/接口工厂4、具体工厂 具体类苹果工厂、水果工厂5、产品使用者使用说明和上例中一样产品类抽象出来这次我们把工厂类也抽象出来生产什么样的产品由子类来决定。代码如下水果接口 苹果类和梨类 代码和上例一样工厂接口 抽象工厂publicinterfaceFruitFactory{FruitcreateFruit();//生产水果}苹果工厂具体工厂publicclassAppleFactoryimplementsFruitFactory{OverridepublicFruitcreateFruit(){returnnewApple();}}梨工厂具体工厂publicclassPearFactoryimplementsFruitFactory{OverridepublicFruitcreateFruit(){returnnewPear();}}产品使用FruitFactoryappleFactorynewAppleFactory();FruitFactorypearFactorynewPearFactory();Appleapple(Apple)appleFactory.createFruit();//获得苹果Pearpear(Pear)pearFactory.createFruit();//获得梨缺点以上这种方式虽然解耦了也遵循了开闭原则但是如果我需要的产品种类很多的话需要创建非常多的具体工厂抽象工厂设计模式例子1定义为创建一组相关或者是相互依赖的对象提供的一个接口而不需要指定它们的具体类。角色和工厂方法一样即1、抽象产品 抽象类/接口CPU、Screen2、具体产品 具体类CPU650、CPU825、Screen5、Screen6等3、抽象工厂 抽象类/接口手机工厂获取CPU 和 Screen的两个成员方法4、具体工厂 具体类小米手机工厂CPU650 Screen5、红米手机工厂CPU825 Screen6。这两个类实现“手机工厂”接口5、产品使用者抽象工厂和工厂方法的模式的区别在于工厂方法是生产一个具体的产品而抽象工厂可以用来生产一组相同有相对关系的产品。重点在于一组一批一系列。举个例子假如生产小米手机小米手机有很多系列小米note、红米note等假如小米note生产需要的配件有825的处理器6英寸屏幕而红米只需要650的处理器和5寸的屏幕就可以了用抽象工厂来实现该例子cpu接口publicinterfaceCpu{voidrun();}cpu实现类classCpu650implementsCpu{Overridepublicvoidrun(){//625 也厉害}}classCpu825implementsCpu{Overridepublicvoidrun(){//825 处理更强劲}}屏幕接口publicinterfaceScreen{voidsize();}屏幕实现类classScreen5implementsScreen{Overridepublicvoidsize(){//5寸}}classScreen6implementsScreen{Overridepublicvoidsize(){//6寸}}工厂接口publicinterfacePhoneFactory{CpugetCpu();//使用的cpuScreengetScreen();//使用的屏幕}具体工厂实现类小米手机工厂publicclassXiaoMiFactoryimplementsPhoneFactory{OverridepublicCpugetCpu(){returnnewCpu825();//高性能处理器}OverridepublicScreengetScreen(){returnnewScreen6();//6寸大屏}}具体工厂实现类红米手机工厂publicclassHongMiFactoryimplementsPhoneFactory{OverridepublicCpugetCpu(){returnnewCpu650();//高效处理器}OverridepublicScreengetScreen(){returnnewScreen5();//小屏手机}}产品使用/** * 生产手机 */publicclassProductPhone{publicstaticvoidmain(String[]args){HongMiFactoryhongMiFactorynewHongMiFactory();CpucpuhongMiFactory.getCpu();ScreenscreenhongMiFactory.getScreen();cpu.run();screen.size();}}所以抽象工厂可以解决一系列的产品生产的需求对于大批量多系列的产品用抽象工厂可以更好的管理和扩展。三种工厂方式总结1总结的非常好下面例子中鼠标键盘耳麦为产品惠普戴尔为工厂。点此查看参考源/菜鸟教程1、简单工厂模式简单工厂模式不是 23 种里的一种简而言之就是有一个专门生产某个产品的类。比如下图中的鼠标工厂专业生产鼠标给参数 0生产戴尔鼠标给参数 1生产惠普鼠标。2、工厂方法模式工厂模式也就是鼠标工厂是个父类有生产鼠标这个接口。戴尔鼠标工厂惠普鼠标工厂继承它可以分别生产戴尔鼠标惠普鼠标。生产哪种鼠标不再由参数决定而是创建鼠标工厂时由戴尔鼠标工厂创建。后续直接调用鼠标工厂.生产鼠标()即可3、抽象工厂模式抽象工厂模式也就是不仅生产鼠标同时生产键盘。也就是 PC 厂商是个父类有生产鼠标生产键盘两个接口。戴尔工厂惠普工厂继承它可以分别生产戴尔鼠标戴尔键盘和惠普鼠标惠普键盘。创建工厂时由戴尔工厂创建。后续工厂.生产鼠标()则生产戴尔鼠标工厂.生产键盘()则生产戴尔键盘。三种工厂方式总结21、对于简单工厂和工厂方法来说两者的使用方式实际上是一样的如果对于产品的分类和名称是确定的数量是相对固定的推荐使用简单工厂模式2、抽象工厂用来解决相对复杂的问题适用于一系列、大批量的对象生产