首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >创建型模式:抽象工厂

创建型模式:抽象工厂

作者头像
LieBrother
发布于 2019-04-02 08:17:46
发布于 2019-04-02 08:17:46
41500
代码可运行
举报
文章被收录于专栏:LieBrotherLieBrother
运行总次数:0
代码可运行

五大创建型模式之三:抽象工厂

简介

姓名:抽象工厂

英文名:Abstract Factory Pattern

价值观:不管你有多少产品,给我就是了

个人介绍

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。

(来自《设计模式之禅》)

今天讲的是抽象工厂模式,小伙伴可能有疑问,抽象工厂和工厂方法之间都有工厂,那肯定是有什么联系的,具体是什么关系呢?简单的说:工厂方法是在解决一个产品多个层级方面的事情;而抽象工厂致力于解决多个产品多个层级方面的事情。举个例子:汽车是由很多零件组成的,比如引擎、轮胎、方向盘等等。现在如果我们是轮胎生产方,要生产宝马轮胎和奔驰轮胎,要用工厂方法还是抽象工厂实现呢?答案是:工厂方法。轮胎是一个产品,宝马轮胎和奔驰轮胎是 2 个不同层级的轮胎,所以用工厂方法解决就足够。假如现在我们是汽车生产方,要生产宝马汽车和奔驰汽车,汽车又包含轮胎和方向盘等等,要用哪个来实现?既然是上面的是工厂方法,那这个就用抽象工厂,因为这涉及到多个产品(轮胎、方向盘等等)和 2 个层级(宝马和奔驰)。这里还没有讲抽象工厂的概念就说了工厂方法和抽象方法的区别,是不是有点陌生?嗯,先记住这个概念,分清楚两者的区别。在不同场景使用不同的设计模式。

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

你要的故事

上面用汽车安装轮胎和方向盘的例子,那这里为了让大家能深入理解,就不用其他例子了。在一个设计模式讲解的过程中,我觉得用一个案例来讲解可以减少读者的阅读理解成本,为了写设计模式这一系列文章,看了不少设计模式方面的书籍,有些书籍在讲解一个设计模式的时候,用了不止一个例子,读完之后印象不是很深刻。这个系列写完之后,想要的效果是:不需要记住设计模式的定义,把这些故事以及故事对应是讲哪个设计模式都记住了,就真正掌握了这些内容了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.liebrother.designpatterns.abstractfactory;
public class AbstractFactoryTest {

    public static void main(String[] args) {
        // 宝马员工安装轮胎和方向盘
        AbstractCarFactory bmwCarFacatory = new BMWCarFactory();
        bmwCarFacatory.installWheel();
        bmwCarFacatory.installSteeringWheel();
        // 奔驰员工安装轮胎和方向盘
        AbstractCarFactory mercedesCarFacatory = new MercedesCarFacatory();
        mercedesCarFacatory.installWheel();
        mercedesCarFacatory.installSteeringWheel();
    }

}

/**
 * 汽车抽象工厂
 */
interface AbstractCarFactory {

    void installWheel();
    void installSteeringWheel();
}

/**
 * 宝马工厂
 */
class BMWCarFactory implements AbstractCarFactory {

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

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

/**
 * 奔驰工厂
 */
class MercedesCarFacatory implements AbstractCarFactory {

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

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

/**
 * 轮胎工厂
 */
interface WheelFacatory {

    String createWheel();
}

/**
 * 宝马轮胎工厂
 */
class BMWWheelFacatory implements WheelFacatory {

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

/**
 * 奔驰轮胎工厂
 */
class MercedesWheelFacatory implements WheelFacatory {

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

/**
 * 方向盘工厂
 */
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 "奔驰方向盘";
    }
}

还是和以往一样,思维开拓一下,这里列举的是给汽车安装轮胎和方向盘,汽车不止这些,如果要加个安装引擎呢?要怎么实现?这里我就不写出来了,让小伙伴尝试一下,写出来了就理解抽象模式这个设计模式啦。

代码:

https://github.com/1CSH1/DesignPatterns/blob/master/src/com/liebrother/designpatterns/abstractfactory/AbstractFactoryTest.java

总结

简单工厂、工厂方法、抽象工厂这几个工厂相关的设计模式的基本内容都讲完了,这几个模式都是为了解耦,为了可扩展。这里要着重说一下,三者之间没有好坏之分,只有在具体的场景才能发挥它们各自的优势。在单产品多层级,层级数量不多的情况下,可以使用简单工厂,层级多且需要支持扩展,可以使用工厂方法;在多产品多层级,可以使用抽象工厂

参考资料:《大话设计模式》、《Java设计模式》、《设计模式之禅》、《研磨设计模式》、《Head First 设计模式》

希望文章对您有所帮助,设计模式系列会持续更新。觉得不错的可以点个赞,分享给身边的小伙伴。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LieBrother 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java面试专题之六:设计模式学习,详细分析抽象工厂模式
所谓抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
用户1289394
2020/11/06
2580
Java面试专题之六:设计模式学习,详细分析抽象工厂模式
创建型模式之门—简单工厂
在我们没有接触到工厂模式(简单工厂、工厂方法模式、抽象工厂模式)之前,我们实例化对象唯一的方法就是通过“new”关键字来完成。但是,大量的使用“new”关键字来实例化对象会违背一些设计原则,因为代码与具体的类型绑在一起,从而导致过多的依赖于细节而非抽象,这样代码就很难适应需求变化。
Miloce
2022/09/28
1520
创建型模式之门—简单工厂
【java设计模式系列】3. 抽象工厂模式(Abstract Factory)
假设现在有一个车辆制造工厂,它生产两种车,A类车和B类车,每类车有其各自的车门和轮子,这就需要不同的车间来做,A类车的车间有生产车门的工作,有生产轮子的工作,B类车的车间有生产车门的工作,有生产轮子的工作,我们需要哪类车的部件时,就去哪个车间拿,拿的过程(相同的操作,抽取出来一个抽象工厂类,这里的拿就是指方法)是一样的。
爱笑的架构师
2020/09/24
2840
【java设计模式系列】3. 抽象工厂模式(Abstract Factory)
Java设计模式(二)之创建型模式:抽象工厂模式
随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机。
全栈程序员站长
2021/04/09
3640
Java设计模式(二)之创建型模式:抽象工厂模式
工厂模式
在23中设计模式中,工厂方法属于创建型的设计模式,只有工厂方法和抽象工厂两种,但是实际我们常与简单工厂混淆,因为简单工厂模式违背了开闭原则。
胖虎
2019/06/26
4720
工厂模式
创建型模式(一)
在我的公众号中,关于七种结构型设计模式已经全部讲完了:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。而十一种行为型模式我们说了4种:策略模式、模板方法模式、观察者模式、责任链模式。关于创建型设计模式我们还没有聊过,所以今天我们来聊一聊创建型模式,创建型模式一共有五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。今天我们先回顾一下工厂方法模式和抽象工厂模式。
每天学Java
2020/06/02
3870
深入理解Java的三种工厂模式
简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类
芋道源码
2019/10/29
2310
工厂设计模式(java版本、spring源码中使用的工厂模式)
最近在学习spring源码,发现在IoC容器初始化的时候创建各种bean,然后在代码中看到各种beanFactory和factoryBean,很显然spring容器在创建bean的过程是使用了工厂设计模式,那么正好总结一下工厂设计模式。
全栈程序员站长
2021/12/23
7140
第21次文章:工厂模式
在我们GOFO23种设计模式中,上期着重介绍了创造型模式中的单例模式,这周我们着重介绍另一种创造型设计模式——工厂模式。
鹏-程-万-里
2019/09/28
3430
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
之前讲解 Spring 的依赖注入的文章时,我们就已经有提到过工厂这种设计模式,我们直接先通过一个例子来看一下究竟工厂模式能用来做什么?
BWH_Steven
2020/11/10
4020
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
Java设计模式(一)之创建型模式:工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说,许多类型对象的创建需要一系列的步骤:你可能需要计算或取得对象的初始位置;选择生成哪个子对象实例;或在你生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
全栈程序员站长
2022/06/29
2930
Java设计模式(一)之创建型模式:工厂模式(简单工厂模式+工厂方法模式)
Java设计模式—工厂模式
工厂模式主要是为创建对象提供了接口。工厂模式分为三类: 1. 简单工厂模式(Simple Factory)  2. 工厂方法模式(Factory Method)  3. 抽象工厂模式(Abstract Factory) 
翎野君
2023/05/12
3840
Java设计模式—工厂模式
设计模式之工厂模式
将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。 实例化对象,用工厂方法代替new操作。
时间静止不是简史
2020/07/24
4570
设计模式之工厂模式
【设计模式】-创建型模式-第2章第2讲-【工厂模式】
2.1、案例场景:假设有一个汽车工厂,目前只生产两种车型,小型跑车和大型家用车。顾客决定买小还是大型。
跟着飞哥学编程
2022/12/02
2950
【地铁上的设计模式】--创建型模式:抽象工厂模式
抽象工厂模式是一种创建型设计模式,它提供了一种方式来封装一组相关或相互依赖的对象的创建过程。抽象工厂模式将具体产品的创建与客户端代码分离开来,通过引入抽象工厂和抽象产品来实现对象的解耦和隐藏。抽象工厂负责定义一组用于创建一系列产品对象的方法,每个方法对应一个具体产品族的创建过程。具体工厂类实现抽象工厂接口,负责创建具体产品对象,并且每个具体工厂类只能创建一种具体产品族的对象。 抽象工厂模式涉及到四个角色:抽象产品、具体产品、抽象工厂和具体工厂。其中,抽象产品定义产品的接口规范,具体产品实现抽象产品的接口规范,抽象工厂定义工厂的接口规范,具体工厂实现抽象工厂的接口规范并负责具体产品的创建。 与工厂方法模式相比,抽象工厂模式的抽象程度更高,因为它不仅能够封装具体产品的创建过程,还能够封装具体产品族的创建过程。在使用抽象工厂模式时,客户端只需要关注抽象工厂和抽象产品,而不需要关注具体的实现细节。 抽象工厂模式适用于需要创建一组相关或相互依赖的对象的场景,例如需要创建一个由多个组成部分的复杂对象或者需要创建一组具有相同风格或主题的界面控件。抽象工厂模式可以保证产品的一致性和相互依赖性,同时还可以提供高度的灵活性和可扩展性,因为只需要增加新的具体产品类和对应的具体工厂类即可实现系统的扩展。
喵叔
2023/04/28
2410
Java描述设计模式(04):抽象工厂模式
汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。
知了一笑
2019/07/23
6210
JAVA设计模式之抽象工厂模式
前面已经介绍过简单工厂模式和工厂方法模式,这里继续介绍第三种工厂模式-抽象工厂模式,还是以汽车的制造为例。
秃头哥编程
2019/06/05
4460
JAVA设计模式之抽象工厂模式
创建型模式————工厂模式(2.2)
工厂模式是创建型模式的一种,工厂是用来生产的,而在Java里,是用来生产对象实例的。
Noneplus
2019/09/24
5070
创建型模式————工厂模式(2.2)
Java设计模式---创建型模式
本章Java设计模式的创建型模式的介绍,是通过学习视频记录的笔记,欢迎留言指出错误点
用户11010370
2024/03/12
1800
Java设计模式(三—四)----工厂模式
Java设计模式 工厂模式 一、引言 二、分类 三、简单工厂模式 四、工厂方法模式 五、抽象工厂模式 六、和工厂方法模式区别 七、总结 工厂模式 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。
汤高
2018/01/11
9150
推荐阅读
相关推荐
Java面试专题之六:设计模式学习,详细分析抽象工厂模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验