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

创建型模式:抽象工厂

作者头像
LieBrother
发布于 2019-04-02 08:17:46
发布于 2019-04-02 08:17:46
40600
代码可运行
举报
文章被收录于专栏: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的三种工厂模式
简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类
芋道源码
2019/10/29
2260
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
之前讲解 Spring 的依赖注入的文章时,我们就已经有提到过工厂这种设计模式,我们直接先通过一个例子来看一下究竟工厂模式能用来做什么?
BWH_Steven
2020/11/10
3970
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
【java设计模式系列】3. 抽象工厂模式(Abstract Factory)
假设现在有一个车辆制造工厂,它生产两种车,A类车和B类车,每类车有其各自的车门和轮子,这就需要不同的车间来做,A类车的车间有生产车门的工作,有生产轮子的工作,B类车的车间有生产车门的工作,有生产轮子的工作,我们需要哪类车的部件时,就去哪个车间拿,拿的过程(相同的操作,抽取出来一个抽象工厂类,这里的拿就是指方法)是一样的。
爱笑的架构师
2020/09/24
2790
【java设计模式系列】3. 抽象工厂模式(Abstract Factory)
Java面试专题之六:设计模式学习,详细分析抽象工厂模式
所谓抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
用户1289394
2020/11/06
2540
Java面试专题之六:设计模式学习,详细分析抽象工厂模式
【设计模式】-创建型模式-第2章第2讲-【工厂模式】
2.1、案例场景:假设有一个汽车工厂,目前只生产两种车型,小型跑车和大型家用车。顾客决定买小还是大型。
跟着飞哥学编程
2022/12/02
2860
创建型模式之门—简单工厂
在我们没有接触到工厂模式(简单工厂、工厂方法模式、抽象工厂模式)之前,我们实例化对象唯一的方法就是通过“new”关键字来完成。但是,大量的使用“new”关键字来实例化对象会违背一些设计原则,因为代码与具体的类型绑在一起,从而导致过多的依赖于细节而非抽象,这样代码就很难适应需求变化。
Miloce
2022/09/28
1490
创建型模式之门—简单工厂
工厂模式
在23中设计模式中,工厂方法属于创建型的设计模式,只有工厂方法和抽象工厂两种,但是实际我们常与简单工厂混淆,因为简单工厂模式违背了开闭原则。
胖虎
2019/06/26
4590
工厂模式
Java描述设计模式(04):抽象工厂模式
汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。
知了一笑
2019/07/23
6160
第21次文章:工厂模式
在我们GOFO23种设计模式中,上期着重介绍了创造型模式中的单例模式,这周我们着重介绍另一种创造型设计模式——工厂模式。
鹏-程-万-里
2019/09/28
3370
设计模式 - 建造者模式
建建:这场疫情啊,让我明白了,有一个房子,能让你稳定住所;有一辆车,能让你出行无忧。
子乾建建-Jeff
2020/06/29
3730
设计模式 - 建造者模式
设计模式(九):抽象工厂模
它属于创建型模式。在抽象工厂模式中,每个具体工厂都提供了多个用于创建多种不同类型具体对象的方法,这些不同类型的对象都存在一个共同的属性,构成一个族。
xujjj
2019/07/22
3890
Java设计模式(二)之创建型模式:抽象工厂模式
随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机。
全栈程序员站长
2021/04/09
3540
Java设计模式(二)之创建型模式:抽象工厂模式
创建型模式(一)
在我的公众号中,关于七种结构型设计模式已经全部讲完了:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。而十一种行为型模式我们说了4种:策略模式、模板方法模式、观察者模式、责任链模式。关于创建型设计模式我们还没有聊过,所以今天我们来聊一聊创建型模式,创建型模式一共有五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。今天我们先回顾一下工厂方法模式和抽象工厂模式。
每天学Java
2020/06/02
3820
设计之禅——工厂方法
我们生活中有许许多多的工厂,为商家提供产品,而我们开发者口中所谈论的工厂方法模式产生灵感也是来源于此,结合生活中的实例我们可以非常轻松的理解该模式。它是一种创建型设计模式,也是项目开发中用的最多的设计模式之一,用于对象的创建。
夜勿语
2020/09/07
2570
设计模式之工厂模式
将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。 实例化对象,用工厂方法代替new操作。
时间静止不是简史
2020/07/24
4470
设计模式之工厂模式
创建型模式:工厂方法
Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. (定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)
LieBrother
2019/04/02
4050
创建型模式:工厂方法
创建型模式————工厂模式(2.2)
工厂模式是创建型模式的一种,工厂是用来生产的,而在Java里,是用来生产对象实例的。
Noneplus
2019/09/24
4890
创建型模式————工厂模式(2.2)
Java设计模式(2)工厂模式
工厂模式是一种创建型设计模式,其主要目标是封装对象的创建过程,使客户端代码与具体类的实例化解耦。通过使用工厂模式,客户端无需直接调用具体类的构造函数,而是通过调用工厂方法或工厂接口来获取所需的对象。这提高了系统的灵活性,使得更容易更换或扩展产品对象。
Jensen_97
2024/04/18
1130
Java设计模式(2)工厂模式
Java设计模式—工厂模式
工厂模式主要是为创建对象提供了接口。工厂模式分为三类: 1. 简单工厂模式(Simple Factory)  2. 工厂方法模式(Factory Method)  3. 抽象工厂模式(Abstract Factory) 
翎野君
2023/05/12
3690
Java设计模式—工厂模式
Java设计模式(四)之创建型模式:建造者模式
Builder:抽象建造者。它声明为创建一个Product对象的各个部件指定的抽象接口。 ConcreteBuilder:具体建造者,实现Builder抽象接口,构建和装配各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。 Director:指挥者。构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象,它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。 Product:产品角色。表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
全栈程序员站长
2021/04/09
5550
Java设计模式(四)之创建型模式:建造者模式
相关推荐
深入理解Java的三种工厂模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档