Dotcpp  >  编程教程  >  创建型模式(Creational Patterns)  >  工厂模式—抽象工厂模式

工厂模式—抽象工厂模式

点击打开在线编译器,边学边练

在抽象工厂模式中,定义了一个抽象工厂接口,它包含一组用于创建一系列互相依赖或相关的对象的方法。具体的工厂类需要实现这个抽象工厂接口,并重写其中的创建方法,用于创建一组特定类型的对象。

抽象工厂模式的优点在于它能够帮助我们创建相关或依赖的一组对象,而无需指定具体的类。这使得系统更加灵活,具有更高的扩展性。缺点在于增加新产品家族时需要修改抽象工厂接口,在系统需求变化频繁时,代码的维护会变得困难。

假如老板的生意做大了,在北京开了个分店,并且不止卖披萨,还卖蛋糕,那么该怎么拓展呢,很简单,只需要在抽象工厂类中新增创建蛋糕的抽象方法就行,如下:

AbstractFactory:

public interface AbstractFactory {
    //制作披萨
    Pizza createPizza(String type);
    //制作蛋糕
    Cake createCake(String type);
}

BJFactory:

//北京分店
public class BJFactory implements AbstractFactory{
    @Override
    public Pizza createPizza(String type) {
        Pizza pizza=null;
        switch (type){
            case "beef":
                Pizza=new BJBeefPizza("北京牛肉披萨");
                break;
            case "pork":
                pizza=new BJPorkPizza("北京猪肉披萨");
            default:
                break;
        }
        return pizza;
    }
 
    @Override
    public Cake createCake(String type) {
        Cake cake=null;
        switch (type){
            case "apple":
                cake=new BJAppleCake("北京苹果蛋糕");
                break;
            case "pear":
                cake=new BJPearCake("北京梨味蛋糕");
            default:
                break;
        }
        return cake;
    }
}

可以看到,抽象工厂仅仅是在工厂方法模式下新增了一些接口,只是工厂方法模式的一个拓展,当抽象工厂只有一个产品体系的话就会退化成工厂模式,所以两者本质上没有太大的区别。

    //4.抽象工厂模式
    @Test
    void abstractFactory(){
        AbstractFactory factory=new BJFactory();
        Cake apple = factory.createCake("apple");
        Pizza pork = factory.createPizza("pork");
 
        apple.prepare();
        apple.make();
        apple.bake();
        apple.sale();
 
        pork.prepare();
        pork.make();
        pork.braise();
        pork.sale();
    }

在使用工厂模式时,需要根据具体的应用场景选择不同的变种。工厂模式的优点在于它可以封装对象的创建过程,便于控制与修改。它在系统设计中具有广泛的应用。


本文固定URL:https://www.dotcpp.com/course/1358

Dotcpp在线编译      (登录可减少运行等待时间)