千家信息网

Java抽象工厂模式实例分析

发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,这篇文章主要介绍了Java抽象工厂模式实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java抽象工厂模式实例分析文章都会有所收获,下面我们一起来看看吧。1.什么是
千家信息网最后更新 2024年10月19日Java抽象工厂模式实例分析

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

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 {         @Override        public void prepare() {                setName("伦敦的胡椒pizza");                System.out.println("伦敦的胡椒pizza 准备原材料");        } }
package com.szh.factory.abstractfactory.pizza; public class LDCheesePizza extends Pizza {         @Override        public void prepare() {                setName("伦敦的奶酪pizza");                System.out.println("伦敦的奶酪pizza 准备原材料");        } }
package com.szh.factory.abstractfactory.pizza; public class BJPepperPizza extends Pizza {         @Override        public void prepare() {                setName("北京的胡椒pizza");                System.out.println("北京的胡椒pizza 准备原材料");        } }
package com.szh.factory.abstractfactory.pizza; public class BJCheesePizza extends Pizza {         @Override        public 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抽象工厂模式实例分析"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

0