目录简单工厂模式工厂方法模式抽象工厂模式简单工厂模式简单工厂主要有以下几个作用工厂(Factory):提供静态工厂方法,负责创建所有具体产品的实例。抽象产品(AbstractProduct):负责描述所有具体产品的公共产品,可以用抽象类或接口来实现。具体产品:是工厂创建的目标产品。下面以“颜料”工厂为例,实现一个简单的工厂抽象产品——颜料(颜色)publicinterfaceColor{voiddraw();}具体产品——黄色、绿色、红色颜料publicclassGreenimplementsColor{@Overridepublicvoiddraw(){System.out.println("绿色颜料");}}publicclassRedimplementsColor{@Overridepublicvoiddraw(){System.out.println("RedPigment");}}publicclassYellowimplementsColor{@Overridepublicvoiddraw(){System.out.println("YellowPigment");}}Factory——颜料工厂——根据传入的参数“生产”相关颜料publicclassColorFactory{publicstaticStringRED="red";publicstaticStringGREEN="green";publicstaticStringYELLOW="黄色";publicstaticColorgetColor(Stringc){if(RED.equalsIgnoreCase(c)){returnnewRed();}}elseif(GREEN.equalsIgnoreCase(c)){returnnewGreen();}elseif(YELLOW.equalsIgnoreCase(c)){returnnewYellow();}别的{返回空值;}}}publicclassColorFactoryTest{@Testpublicvoidtest(){颜色颜色=ColorFactory.getColor(ColorFactory.GREEN);color.draw();}}========Result========如果对象可以复用,那么就不用每次都创建新的对象,可以先缓存起来,获取对应的对象每个请求的缓存如下:publicclassColorCacheFactory{publicstaticStringRED="red";publicstaticStringGREEN="green";publicstaticStringYELLOW="黄色";privatestaticfinalMapcacheMap=newHashMap<>();static{cacheMap.put(RED,newRed());cacheMap.put(GREEN,newGreen());cacheMap.put(YELLOW,newYellow());}publicstaticColorgetColor(Strings){returncacheMap.get(s);}}工厂方法模式在简单工厂模式下,每增加一个具体的实例,就必须为对应的工厂执行相应的代码,违背了SOLID中的开闭原则。于是工厂方法模式的出现就是为了解决这个问题。工厂方法模式有以下作用:抽象工厂(AbstractFactory)、具体工厂(ConcreteFactory)、抽象产品(AbstractProduct)、具体产品(ConcreteProduct)与简单工厂相比,这里的工厂变成了抽象工厂+具体工厂,下面我们同样使用paint的例子,抽象产品和具体产品同上,所以下面的代码不再赘述AbstractfactorypublicinterfaceColorFactory{StringRED="red";字符串GREEN="绿色";字符串YELLOW="黄色";ColorgetColor();}具体工厂publicclassGreenColorFactoryimplementsColorFactory{@OverridepublicColorgetColor(){returnnewGreen();}}publicclassRedColorFactory实现ColorFactory{@OverridepublicColorgetColor(){returnnewRed();}}公共类YellowColorFactory实现ColorFactory{@OverridepublicColorgetColor(){returnnewYellow();}}如何使用ColorFactoryfactory=newGreenColorFactory();factory.getColor().draw();符合开闭原则的问题没有任何其他优势。反之,由于产生了很多新的工厂类,会增加一定的代码量。但是如果换个角度来看,如果创建一个Color实例不是像newRed()这样简单的一行代码,而是一个比较复杂的过程,那么把这些代码全部混在一个简单的工厂。选择。publicstaticColorgetColor(Stringc){if(RED.equalsIgnoreCase(c)){红色=newRed();...返回颜色;}elseif(GREEN.equalsIgnoreCase(c)){绿色=新绿色();...返回颜色;}elseif(YELLOW.equalsIgnoreCase(c)){黄色=newYellow();...返回颜色;}else{返回空值;}}AbstractFactoryPattern抽象工厂模式是用多个相同主题的工厂封装一组队友。抽象工厂是工厂方法的升级版。工厂方法模式只生产同一种类型的产品,而抽象工厂模式可以生产多种类型的产品。我们继续以“颜料”为主题进行升级。颜料经常被用来给衣服上色,所以我们创建一个生产颜料和衣服的抽象工厂。publicinterfaceColor{voiddraw();}publicclassGreenimplementsColor{@Overridepublicvoiddraw(){System.out.println("绿色颜料");}}publicclassRedimplementsColor{@Overridepublicvoiddraw(){System.out.println("红色颜料");}}publicinterfaceApparel{voidcrop();}publicclassPantsimplementsApparel{@Overridepublicvoidcrop(){System.out.println("裁剪裤子");}}publicclassShirtsimplementsApparel{@Overridepublicvoidcrop(){System.out.println("裁剪衬衣");}}publicinterfaceAbstractFactory{ColorgetColor();服装getApparel();}publicclassGreenPantsFactoryimplementsAbstractFactory{@OverridepublicColorgetColor(){returnnewGreen();}@OverridepublicApparelgetApparel(){returnnewPants();}}公共类RedShirtsFactory实现AbstractFactory{@Overridepublic颜色getColor(){返回新的红色();}@OverridepublicApparelgetApparel(){returnnewShirts();}}publicclassMethodFactoryTest{@Testpublicvoidtest(){AbstractFactoryfactory=newGreenPantsFactory();工厂。getColor().draw();factory.getApparel().crop();}}=====result=====greenpaintcroppants,抽象工厂模式有多个工厂方法。具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个