Java抽象工厂模式实例分析
短信预约 -IT技能 免费直播动态提醒
这篇文章主要介绍了Java抽象工厂模式实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java抽象工厂模式实例分析文章都会有所收获,下面我们一起来看看吧。
1.什么是抽象工厂模式?
抽象工厂模式: 定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
将工厂抽象成两层,AbsFactory(抽象工厂))和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
我们仍然以上一篇文章的案例为主,画出抽象工厂模式下的类图。
2.案例代码
首先仍然是Pizza种类相关的几个类。
package com.szh.factory.abstractfactory.pizza; public abstract class Pizza { //Pizza名称 protected String name; //准备原材料,不同的披萨不一样。因此,我们做成抽象方法,具体的原材料实现交给它的子类去完成 public abstract void prepare(); //烘烤 public void bake() { System.out.println(name + " baking;"); } //切割 public void cut() { System.out.println(name + " cutting;"); } //打包 public void box() { System.out.println(name + " boxing;"); } public void setName(String name) { this.name = name; }}
package com.szh.factory.abstractfactory.pizza; public class LDPepperPizza extends Pizza { @Overridepublic void prepare() {setName("伦敦的胡椒pizza");System.out.println("伦敦的胡椒pizza 准备原材料");} }
package com.szh.factory.abstractfactory.pizza; public class LDCheesePizza extends Pizza { @Overridepublic void prepare() {setName("伦敦的奶酪pizza");System.out.println("伦敦的奶酪pizza 准备原材料");} }
package com.szh.factory.abstractfactory.pizza; public class BJPepperPizza extends Pizza { @Overridepublic void prepare() {setName("北京的胡椒pizza");System.out.println("北京的胡椒pizza 准备原材料");} }
package com.szh.factory.abstractfactory.pizza; public class BJCheesePizza extends Pizza { @Overridepublic void prepare() {setName("北京的奶酪pizza");System.out.println("北京的奶酪pizza 准备原材料");} }
下面是抽象工厂和工厂方法的区别之处。
package com.szh.factory.abstractfactory.order; import com.szh.factory.abstractfactory.pizza.Pizza; //一个抽象工厂模式的抽象层(接口)public interface AbsFactory { //让下面的工厂子类来具体实现 public Pizza createPizza(String orderType);}
package com.szh.abstractfactory.order; import com.szh.abstractfactory.pizza.BJCheesePizza;import com.szh.abstractfactory.pizza.BJPepperPizza;import com.szh.abstractfactory.pizza.Pizza; public class BJFactory implements AbsFactory { @Override public Pizza createPizza(String orderType) { Pizza pizza = null; if("cheese".equals(orderType)) { pizza = new BJCheesePizza(); } else if ("pepper".equals(orderType)){ pizza = new BJPepperPizza(); } return pizza; }}
package com.szh.abstractfactory.order; import com.szh.abstractfactory.pizza.LDCheesePizza;import com.szh.abstractfactory.pizza.LDPepperPizza;import com.szh.abstractfactory.pizza.Pizza; public class LDFactory implements AbsFactory { @Override public Pizza createPizza(String orderType) { Pizza pizza = null; if ("cheese".equals(orderType)) { pizza = new LDCheesePizza(); } else if ("pepper".equals(orderType)) { pizza = new LDPepperPizza(); } return pizza; }}
package com.szh.factory.abstractfactory.order; import com.szh.factory.abstractfactory.pizza.Pizza; import java.util.Scanner; public class OrderPizza { AbsFactory absFactory; public OrderPizza(AbsFactory absFactory) { setFactory(absFactory); } private void setFactory(AbsFactory absFactory) { Pizza pizza = null; String orderType = ""; // 用户输入 this.absFactory = absFactory; do { orderType = getType(); // factory 可能是北京的工厂子类,也可能是伦敦的工厂子类 pizza = absFactory.createPizza(orderType); if (pizza != null) { // 订购ok pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } else { System.out.println("订购失败"); break; } } while (true); } // 写一个方法,可以获取客户希望订购的披萨种类 private String getType() { Scanner scanner = new Scanner(System.in); System.out.println("请输入 pizza 种类: "); String str = scanner.nextLine(); return str; }}
最后是测试类。
package com.szh.abstractfactory; import com.szh.abstractfactory.order.BJFactory;import com.szh.abstractfactory.order.LDFactory;import com.szh.abstractfactory.order.OrderPizza; import java.util.Scanner; public class MainTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String content = scanner.next(); if ("Beijing".equals(content)) { new OrderPizza(new BJFactory()); } else if ("London".equals(content)) { new OrderPizza(new LDFactory()); } else { System.out.println("无法预先匹配Pizza种类...."); scanner.close(); } }}
关于“Java抽象工厂模式实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java抽象工厂模式实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341