WX搜索:程序员的个人修养订阅最新内容定义抽象工厂模式提供了一个接口,用于在不显式指定具体类的情况下创建相关或依赖对象族首先,让我们了解下产品的概念家庭。我们还是以咖啡店为例。我们知道社会上不仅有星巴克咖啡品牌,还有我们国产的瑞幸咖啡、上岛咖啡、咖啡翼。在这些品牌下,将提供不同口味的咖啡,如拿铁、摩卡和卡布奇诺。一个产品族可以看作是同一品牌下不同口味的咖啡,例如:星巴克品牌的拿铁咖啡、摩卡咖啡和卡布奇诺咖啡就称为一个产品族。同样,LuckinCoffee和CoffeeWings代表了另一个产品系列。抽象工厂适用于这种需要生成产品族的场景。抽象产品类在内部提供了多个其他抽象产品,抽象工厂类定义了产品创建接口。通过具体的工厂子类,可以生产出相应的产品族对象。类图抽象工厂模式主要包括四个角色:抽象工厂:声明创建抽象产品对象的操作接口;具体工厂:实现创建具体产品对象的操作;抽象产品:为一类产品对象声明一个接口;specificproducts:定义一个product对象,由相应的具体工厂创建;代码实现packagecom.study.design.Factory.abstractfactory;/***abstractproduct*lattecoffee*/publicinterfaceLatte{voidcoffeeName();}packagecom.study.design.Factory.abstractfactory;/***abstractproduct*lattecoffee*/publicinterfaceMocha{voidcoffeName();}packagecom.study.design.Factory.abstractfactory;/***productfamily特定产品:LatteCoffee*产品组族:RuixingCoffee*/publicclassRuiXingLatteimplementsLatte{@OverridepublicvoidcoffeName(){System.out.println("IgotaRuiXingLatte");}}包com。study.design.Factory.abstractfactory;/***产品系列中的特定产品:摩卡咖啡*产品组系列:瑞幸咖啡*/publicclassRuiXingMochaimplementsMocha{@OverridepublicvoidcoffeeName(){System.out.println("我拿到了瑞幸摩卡");}}packagecom.study.design.Factory.abstractfactory;/***产品系列中的特定产品:摩卡咖啡*产品组系列:星巴克*/publicclassStarbuckeMochaimplementsMocha{@OverridepublicvoidcoffeName(){System.out.println("我买了星巴克摩卡咖啡");}}packagecom.study.design.Factory.abstractfactory;/***产品系列中的特定产品:latte*产品组系列:Starbucks*/publicclassStarbucksLatteimplementsLatte{@OverridepublicvoidcoffeName(){System.out.println("我有一杯星巴克拿铁咖啡");}}packagecom.study.design.Factory.abstractfactory;导入太阳。misc.GC;/***产品系列中的特定产品:Latte*产品组系列:WingCoffe*/publicclassWingCoffeLatteimplementsLatte{@OverridepublicvoidcoffeeName(){System.out.println("IgotaWingCoffeLatte");}}packagecom.study.design.Factory.abstractfactory;/***产品系列中的特定产品:摩卡咖啡*产品组系列:CoffeeWing*/publicclassWingCoffeMochaimplementsMocha{@OverridepublicvoidcoffeName(){System.out.println("我得到了WingCoffeMocha");}}packagecom.study.design.Factory.abstractfactory;/***AbstractFactory*CafeInterface*/publicinterfaceCoffeShop{//制作拿铁咖啡Latte制作延迟();//制作摩卡咖啡MochamakeMocha();}packagecom.study.design.Factory.abstractfactory;/***具体工厂*瑞幸咖啡*/publicclassRuiXingCoffeShopimplementsCoffeShop{@OverridepublicLattemakeLate(){returnnewRuiXingLatte();}@OverridepublicMochamakeMocha(){returnnewRuiXingMocha();}}packagecom.study.design.Factory.abstractfactory;/***具体工厂*星巴克咖啡店*/publicclassStarbucksShopimplementsCoffeShop{@OverridepublicLattemakeLate(){returnnewStarbucksLatte();}@OverridepublicMochamakeMocha(){返回新的StarbuckeMocha();}}packagecom.study.design.Factory.abstractfactory;/***具体工厂*CoffeeWingCafe*/publicclassWingCoffeCoffeShopimplementsCoffeShop{@OverridepublicLattemakeLate(){returnnewWingCoffeLatte();}@OverridepublicMochamakeMocha(){returnnewWingCoffeMocha();}}包com.study.design.Factory.abstractfactory;publicclassAbstractFactoryTest{publicstaticvoidmain(String[]args){//产品组族:瑞幸咖啡CoffeShopcoffeShop=newRuiXingCoffeShop();Lattelatte=coffeeShop.makeLate();latte.coffeeName();摩卡摩卡=coffeeShop.makeMocha();摩卡咖啡名称();//产品组系列:星巴克咖啡店coffeShop=newStarbucksShop();latte=coffeeShop.makeLate();latte.coffeeName();mocha=coffeeShop.makeMocha();摩卡咖啡名称();//产品组系列:CoffeeWingCoffeeShopcoffeShop=newWingCoffeCoffeShop();latte=coffeeShop.makeLate();latte.coffeeName();mocha=coffeeShop.makeMocha();摩卡.coffeName();}}三种工厂模式与简单工厂模式的比较简单工厂模式(又称静态工厂方法模式)有一个特定的工厂类,可以生成多种不同的产品,属于创建型设计模式。简单工厂模式未包含在GoF23设计模式中。对于产品种类较少的情况,可以考虑使用简单工厂模式来轻松创建所需的对象。使用简单工厂模式的客户端只需要传入相应的参数,不需要关心创建对象的逻辑。简单工厂模式结构简单,调用方便。对于外界给出的信息,可以很容易地创造出相应的产品。工厂和产品的职责分工明确。但是,一个工厂类负责所有产品的创建。当产品数量增多时,工厂类的代码会非常臃肿,违背了高度聚合的原则。工厂方法模式在工厂方法模式中,产品不再是由单一的工厂类生产出来的,而是由工厂类的子类实现具体产品的创建。因此,在添加产品时,只需要添加工厂类的相应子类即可,解决了简单工厂中代码臃肿的问题,符合开闭原则。增强了灵活性,对于新产品的创建,只需要编写相应的工厂类即可。在典型的解耦框架中,高层模块只需要知道产品的抽象类,不需要关心其他的实现类。但是,类的数量往往过多,增加了复杂性,也增加了抽象和理解系统的难度。通过抽象工厂模式可以解决一个抽象产品只能生产一个产品的问题。抽象工厂模式当需要一个产品族时,抽象工厂可以保证客户端始终只使用同一产品的产品族。增强了程序的可扩展性。对于新产品族的加入,只需要实现一个新的具体工厂即可,符合开闭原则。但是在产品族中很难扩展新的产品,需要修改抽象工厂的接口。增加了系统的抽象性和理解难度。WX搜索:程序员的个人修养订阅最新内容
