抽象工厂模式详解 (附java语言源码)

抽象工厂模式(Abstract Factory Pattern)

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。(Provide an interface for creating families of related or dependent object without specifying their concrete classes.)

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

工厂方法是在解决一个产品多个层级方面的事情;而抽象工厂致力于解决多个产品多个层级方面的事情。举个例子:汽车是由很多零件组成的,比如轮胎、方向盘等等。
举个例子:汽车是由很多零件组成的,比如轮胎、方向盘等等。现在如果我们是轮胎生产方,要生产宝马轮胎和奔驰轮胎,要用工厂方法还是抽象工厂实现呢?答案是:工厂方法。轮胎是一个产品,宝马轮胎和奔驰轮胎是 2 个不同层级的轮胎,所以用工厂方法解决就足够。假如现在我们是汽车生产方,要生产宝马汽车和奔驰汽车,汽车又包含轮胎和方向盘等等,要用哪个来实现?既然是上面的是工厂方法,那这个就用抽象工厂,因为这涉及到多个产品(轮胎、方向盘等等)和 2 个层级(宝马和奔驰)。

上面定义中:为创建一组相关或相互依赖的对象提供一个接口。这样子理解这句话,比如上面说的轮胎和方向盘,宝马汽车用的轮胎和方向盘需要都是宝马品牌的,也就是说在安装宝马汽车的轮胎和方向盘的时候,得用宝马生产的轮胎和方向盘,重要的一点是:轮胎和方向盘是互相依赖的,不能在宝马汽车上安装奔驰轮胎和宝马方向盘,因为有这个依赖关系,所以我们需要提供一个额外的接口,来保证宝马汽车使用的轮胎和方向盘都是宝马生产的。这就是抽象工厂干的事情。

案例可以分为以下4步:

第一步:创建抽象汽车工厂接口,宝马工厂和奔驰工厂实现这个接口。

//抽象汽车工厂接口
public interface AbstractCarFactory {
    void installWheel();
    void installSteeringWheel();
}

//宝马工厂
class BMWCarFactory implements AbstractCarFactory {

    @Override
    public void installWheel() {
        BMWWheelFactory bmwWheelFactory = new BMWWheelFactory();
        String wheel = bmwWheelFactory.createWheel();
        System.out.println("安装轮胎:"+wheel);
    }

    @Override
    public void installSteeringWheel() {
        BMWSteeringWheelFacatory bmwSteeringWheelFacatory = new BMWSteeringWheelFacatory();
        String steeringWheel = bmwSteeringWheelFacatory.createSteeringWheel();
        System.out.println("安装方向盘:" + steeringWheel);
    }
}

//奔驰工厂
class MercedesCarFacatory implements AbstractCarFactory {
    @Override
    public void installWheel() {
        MercedesWheelFactory mercedesWheelFactory = new MercedesWheelFactory();
        String wheel = mercedesWheelFactory.createWheel();
        System.out.println("安装轮胎:"+wheel);
    }
    @Override
    public void installSteeringWheel() {
        MercedesSteeringWheelFacatory mercedesSteeringWheelFacatory = new MercedesSteeringWheelFacatory();
        String steeringWheel = mercedesSteeringWheelFacatory.createSteeringWheel();
        System.out.println("安装方向盘:" + steeringWheel);
    }
}

第二步:创建轮胎工厂接口,宝马轮胎工厂和奔驰轮胎工厂实现这个接口。

//轮胎工厂接口
public interface WheelFacatory {
    String createWheel();
}

//宝马轮胎工厂
class BMWWheelFactory implements WheelFacatory {
    @Override
    public String createWheel() {
        System.out.println("宝马轮胎工厂生产轮胎");
        return "宝马轮胎";
    }
}

//奔驰轮胎工厂
class MercedesWheelFactory implements WheelFacatory {
    @Override
    public String createWheel() {
        System.out.println("奔驰轮胎工厂生产轮胎");
        return "奔驰轮胎";
    }
}

第三步:创建方向盘工厂接口,宝马方向盘工厂和奔驰方向盘工厂实现这个接口。

//方向盘工厂接口
public interface SteeringWheelFacatory {
    String createSteeringWheel();
}

//宝马方向盘工厂
class BMWSteeringWheelFacatory implements SteeringWheelFacatory{
    @Override
    public String createSteeringWheel() {
        System.out.println("宝马方向盘工厂生产方向盘");
        return "宝马方向盘";
    }
}

//奔驰方向盘工厂
class MercedesSteeringWheelFacatory implements SteeringWheelFacatory{
    @Override
    public String createSteeringWheel() {
        System.out.println("奔驰方向盘工厂生产方向盘");
        return "奔驰方向盘";
    }
}

第四步:测试类

//测试
public class AbstractFactoryTest {
    public static void main(String[] args) {
        // 宝马员工安装轮胎和方向盘
        BMWCarFactory bmwCarFactory = new BMWCarFactory();
        bmwCarFactory.installWheel();
        bmwCarFactory.installSteeringWheel();

        // 奔驰员工安装轮胎和方向盘
        MercedesCarFacatory mercedesCarFacatory = new MercedesCarFacatory();
        mercedesCarFacatory.installWheel();
        mercedesCarFacatory.installSteeringWheel();

    }
}

测试结果如下图所示:
在这里插入图片描述

如果想了解更多设计模式,可点击:设计模式概述 以及 23种设计模式的介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据知道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值