欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

创建型设计模式——抽象工厂模式

发布时间:2024/1/1 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 创建型设计模式——抽象工厂模式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

  • 抽象工厂模式:  定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
  • 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
  • 将工厂抽象成两层,AbsFactory(抽象工厂))和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
  • 我们仍然以上一篇文章的案例为主,画出抽象工厂模式下的类图。


    2.案例代码

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

    package com.szh.factory.abstractfactory.pizza;/*** 声明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 {@Overridepublic 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 {@Overridepublic 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) { // 订购okpizza.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();}} }


    3.工厂方法 + 抽象工厂总结

  • 工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
  • 遵循了依赖倒转原则:创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。   不要让类继承具体类,而是继承抽象类或者是实现interface(接口)不要覆盖基类中已经实现的方法。
  • 总结

    以上是生活随笔为你收集整理的创建型设计模式——抽象工厂模式的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。