10.抽象工厂模式

江湖上再也没人找林家的麻烦了。因为林平之一怒之下将辟邪剑谱公诸天下。一下子印出去几万份,江湖上人人都能轻而易举的得到这本无尚武学;然而江湖人士却陷入深深的矛盾之中:

不练,别人练了,分分钟秒杀你;练了,不光要做出极大的牺牲,而且练完后也就那么回事,因为别人也练了。

------《笑傲江湖之内卷》

如果说简单工厂模式和工厂方法模式是《嵩山剑法》和《大嵩阳神掌》,那么抽象工厂模式就是被广而告之的《辟邪剑谱》。只不过,在掌握了前面两种工厂模式后,抽象工厂模式要容易理解的多。


一言

抽象工厂模式是简单工厂模式和工厂方法模式的整合。


概述

抽象工厂模式定义了一个interface用于创建相关或有依赖关系的对象族,而无需指明具体的类。它可以将简单工厂模式和工厂方法模式进行整合。

从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。将工厂抽象成两层,AbsFactory(抽象工厂) 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇更利于代码的维护和扩展。


更进一步

作为一个95后,笔者依稀记得初中时候在学校旁有一家很好吃的面馆,店面不大却很是整洁,在那个没有自媒体和云支付的时代依然是生意火爆。自然的,在我上高中的时候,这家店就开了大量的连锁店,虽然名声还在可是分店的味道却渐渐不如人意。慢慢的,传来了面馆经营不善的消息,我还在当时的报纸上看到了老板的求贤广告。

我觉得这其实是很多加盟类餐饮要面临的最大挑战之一,挺住了就是做大做强,挺不住可能就是血本无归。这个问题就是,在分店不断扩张的情况下,如何保持品牌原本的竞争力是可复制的。

其实,工厂方法模式和抽象工厂模式就很好的阐明了这一点。在最初接触两种模式很容易混淆,不理解工厂方法模式和抽象工厂模式的区别,如果用我的话简单来说,工厂方法模式就像一个小老板,它将自己优秀的方法抽象出来,允许子类继承和实现,但是主体基本还是掌控在自己手里。所以,这个小老板会有为数不多的分店(子类),但势必不会将事业做的很大。

而抽象工厂模式则是一个一心想打通整个产业链的企业家,它不拘泥于优势方法的具体实现,它只想要扩展性最高的实现方案。


案例

我还是延续上一次的案例,wayne 继续着造车梦,这一次我们在北京、伦敦都开设了造车工厂,使得我不得不将部分的自主权利下放的各个工厂。
抽象工厂

java 复制代码
public interface AbsFactory {
    public Car createCar(String orderType);
}

北京工厂

java 复制代码
public class BjFactory implements AbsFactory{
    @Override
    public Car createCar(String orderType) {
        Car car =null;
        if (orderType.equals("oil")){
            car = new OilCar();
            car.setName("北京产 wayne 系列混合动力轿车");
        }else if (orderType.equals("ele")){
            car = new EleCar();
            car.setName("北京产 wayne 系列电车  ");
        }
        return car;
    }
}

伦敦工厂

java 复制代码
public class LDFactory implements AbsFactory{
    @Override
    public Car createCar(String orderType) {
        Car car =null;
        if (orderType.equals("oil")){
            car = new OilCar();
            car.setName("伦敦产 wayne 系列混合动力轿车");
        }else if (orderType.equals("ele")){
            car = new EleCar();
            car.setName("伦敦产 wayne 系列电车  ");
        }
        return car;
    }
}

订单

java 复制代码
public class OrderCar {
    AbsFactory factory;
    //构造器
    public OrderCar(AbsFactory factory){
        setAbsFactory(factory);
    }
    //set工厂
    private void setAbsFactory(AbsFactory factory){
        System.out.println("使用的是抽象工厂模式");
        Car car = null;
        String orderType="";
        this.factory = factory;
        do {
            orderType = getType();
            car = factory.createCar(orderType);//factory可能是北京的工厂也可能是伦敦的工厂
            if (car!=null){
                car.prepare();
                car.process();
                car.assemble();
                car.check();
            }else {
                System.out.println("订购失败");
                break;
            }
        }while (true);
    }
    private String getType(){
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input car type");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
}

分析

可以看到结构上和工厂方法模式非常像,对于二者的区别我们可以再根据chatGPT的回答深入理解下:


也就是说抽象方法模式更像是为更广泛的产品体系准备的一种工厂模式。它使得整个体系更加松散和灵活实现了高度解耦的结构。


关注我,共同进步,每周至少一更。------Wayne

相关推荐
一只叫煤球的猫7 分钟前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
最初的↘那颗心8 分钟前
Flink Stream API 源码走读 - print()
java·大数据·hadoop·flink·实时计算
JH30731 小时前
Maven的三种项目打包方式——pom,jar,war的区别
java·maven·jar
带刺的坐椅2 小时前
轻量级流程编排框架,Solon Flow v3.5.0 发布
java·solon·workflow·flow·solon-flow
David爱编程2 小时前
线程调度策略详解:时间片轮转 vs 优先级机制,面试常考!
java·后端
阿冲Runner3 小时前
创建一个生产可用的线程池
java·后端
写bug写bug3 小时前
你真的会用枚举吗
java·后端·设计模式
喵手4 小时前
如何利用Java的Stream API提高代码的简洁度和效率?
java·后端·java ee
-Xie-4 小时前
Maven(二)
java·开发语言·maven
IT利刃出鞘4 小时前
Java线程的6种状态和JVM状态打印
java·开发语言·jvm