这篇文章主要介绍了Java抽象工厂模式实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java抽象工厂模式实例分析文章都会有所收获,下面我们一起来看看吧。

1.什么是抽象工厂模式?

抽象工厂模式: 定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。

抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。

将工厂抽象成两层,AbsFactory(抽象工厂))和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

我们仍然以上一篇文章的案例为主,画出抽象工厂模式下的类图。

2.案例代码

首先仍然是Pizza种类相关的几个类。

packagecom.szh.factory.abstractfactory.pizza;/***声明Pizza类为抽象类*/publicabstractclassPizza{//Pizza名称protectedStringname;//准备原材料,不同的披萨不一样。因此,我们做成抽象方法,具体的原材料实现交给它的子类去完成publicabstractvoidprepare();//烘烤publicvoidbake(){System.out.println(name+"baking;");}//切割publicvoidcut(){System.out.println(name+"cutting;");}//打包publicvoidbox(){System.out.println(name+"boxing;");}publicvoidsetName(Stringname){this.name=name;}}

packagecom.szh.factory.abstractfactory.pizza;publicclassLDPepperPizzaextendsPizza{@Overridepublicvoidprepare(){setName("伦敦的胡椒pizza");System.out.println("伦敦的胡椒pizza准备原材料");}}

packagecom.szh.factory.abstractfactory.pizza;publicclassLDCheesePizzaextendsPizza{@Overridepublicvoidprepare(){setName("伦敦的奶酪pizza");System.out.println("伦敦的奶酪pizza准备原材料");}}

packagecom.szh.factory.abstractfactory.pizza;publicclassBJPepperPizzaextendsPizza{@Overridepublicvoidprepare(){setName("北京的胡椒pizza");System.out.println("北京的胡椒pizza准备原材料");}}

packagecom.szh.factory.abstractfactory.pizza;publicclassBJCheesePizzaextendsPizza{@Overridepublicvoidprepare(){setName("北京的奶酪pizza");System.out.println("北京的奶酪pizza准备原材料");}}

下面是抽象工厂和工厂方法的区别之处。

packagecom.szh.factory.abstractfactory.order;importcom.szh.factory.abstractfactory.pizza.Pizza;//一个抽象工厂模式的抽象层(接口)publicinterfaceAbsFactory{//让下面的工厂子类来具体实现publicPizzacreatePizza(StringorderType);}

packagecom.szh.abstractfactory.order;importcom.szh.abstractfactory.pizza.BJCheesePizza;importcom.szh.abstractfactory.pizza.BJPepperPizza;importcom.szh.abstractfactory.pizza.Pizza;publicclassBJFactoryimplementsAbsFactory{@OverridepublicPizzacreatePizza(StringorderType){Pizzapizza=null;if("cheese".equals(orderType)){pizza=newBJCheesePizza();}elseif("pepper".equals(orderType)){pizza=newBJPepperPizza();}returnpizza;}}

packagecom.szh.abstractfactory.order;importcom.szh.abstractfactory.pizza.LDCheesePizza;importcom.szh.abstractfactory.pizza.LDPepperPizza;importcom.szh.abstractfactory.pizza.Pizza;publicclassLDFactoryimplementsAbsFactory{@OverridepublicPizzacreatePizza(StringorderType){Pizzapizza=null;if("cheese".equals(orderType)){pizza=newLDCheesePizza();}elseif("pepper".equals(orderType)){pizza=newLDPepperPizza();}returnpizza;}}

packagecom.szh.factory.abstractfactory.order;importcom.szh.factory.abstractfactory.pizza.Pizza;importjava.util.Scanner;publicclassOrderPizza{AbsFactoryabsFactory;publicOrderPizza(AbsFactoryabsFactory){setFactory(absFactory);}privatevoidsetFactory(AbsFactoryabsFactory){Pizzapizza=null;StringorderType="";//用户输入this.absFactory=absFactory;do{orderType=getType();//factory可能是北京的工厂子类,也可能是伦敦的工厂子类pizza=absFactory.createPizza(orderType);if(pizza!=null){//订购okpizza.prepare();pizza.bake();pizza.cut();pizza.box();}else{System.out.println("订购失败");break;}}while(true);}//写一个方法,可以获取客户希望订购的披萨种类privateStringgetType(){Scannerscanner=newScanner(System.in);System.out.println("请输入pizza种类:");Stringstr=scanner.nextLine();returnstr;}}

最后是测试类。

packagecom.szh.abstractfactory;importcom.szh.abstractfactory.order.BJFactory;importcom.szh.abstractfactory.order.LDFactory;importcom.szh.abstractfactory.order.OrderPizza;importjava.util.Scanner;publicclassMainTest{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);Stringcontent=scanner.next();if("Beijing".equals(content)){newOrderPizza(newBJFactory());}elseif("London".equals(content)){newOrderPizza(newLDFactory());}else{System.out.println("无法预先匹配Pizza种类....");scanner.close();}}}

关于“Java抽象工厂模式实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java抽象工厂模式实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。