抽象工厂模式详解 (附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种设计模式的介绍

此资源出自下面的作者,我只是转载,非常实用的设计方法,如果您想成位出色的设计师,那就再复习复习吧!如果您想成为软件设计师,通过学习,您将会站另一个高度看待软件设计. 原始地址:http://terrylee.cnblogs.com/archive/2005/12/13/295965.html ========================================= 抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型的右边车门、左边车门、右前挡泥板、左前挡泥板和引擎罩等等。通过使用转轮来改变冲压盘,这个机械产生的具体类可以在三分钟内改变。 抽象工厂之新解 虚拟案例 中国企业需要一项简单的财务计算:每月月底,财务人员要计算员工的工资。 员工的工资 = (基本工资 + 奖金 - 个人所得税)。这是一个放之四海皆准的运算法则。 为了简化系统,我们假设员工基本工资总是4000美金。 中国企业奖金和个人所得税的计算规则是: 奖金 = 基本工资(4000) * 10% 个人所得税 = (基本工资 + 奖金) * 40% 我们现在要为此构建一个软件系统(代号叫Softo),满足中国企业的需求。 案例分析 奖金(Bonus)、个人所得税(Tax)的计算是Softo系统的业务规则(Service)。 工资的计算(Calculator)则调用业务规则(Service)来计算员工的实际工资。 工资的计算作为业务规则的前端(或者客户端Client)将提供给最终使用该系统的用户(财务人员)使用。 针对中国企业为系统建模 根据上面的分析,为Softo系统建模如下: 则业务规则Service类的代码如下: ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据知道

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

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

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

打赏作者

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

抵扣说明:

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

余额充值