创建型模式:抽象工厂

个人博客原文:

创建型模式:抽象工厂

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

简介

姓名 :抽象工厂

英文名 :Abstract Factory Pattern

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

个人介绍

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

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

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

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

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

你要的故事

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

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

代码:

AbstractFactoryTest.java

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

总结

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

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

推荐阅读:

创建型模式:单例模式

创建型模式:工厂方法

希望文章对您有所帮助,设计模式系列会持续更新,感兴趣的同学可以关注公众号,第一时间获取文章推送阅读,也可以一起交流,交个朋友。

公众号之设计模式系列文章

原文地址:https://www.cnblogs.com/liebrother/p/10296253.html

时间: 2024-11-08 23:35:15

创建型模式:抽象工厂的相关文章

创建型模式 抽象工厂

/** * 创建型模式 抽象工厂 * 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. * * 抽象工厂(Creator)角色 * 抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口. * 具体工厂( Concrete Creator)角色 * 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象. * 抽象(Product)角色 * 抽象

4、设计模式-创建型模式-抽象工厂模式

抽象工厂模式 产品等级结构和产品族 工厂方法模式中具体工厂负责生产具体的产品 每一个具体工厂对应一种具体的产品 工厂方法具有唯一性 一般情况下:一个具体工厂中只有一个或一组重载的工厂方法 有时候希望一个一个工厂可以提供多个产品对象 而不是单一的产品对象 产品等级结构: 产品等级结构即产品的继承结构,如一个抽象类是电视机 子类有海尔电视机.海信电视机等 抽象电视机与具体与具体品牌的电视机之间构成了一个产品等级结构 抽象电视机是父类,具体品牌的电视机是其子类 产品族: 在抽象工厂模式中 产品族是指由

第5章 创建型模式—抽象工厂模式

1. 抽象工厂的定义 (1)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 ①只需各要知道创建一系列对象的接口,而无需知道具体使用的是哪一个实现 ②这一系列对象是相关或相互依赖的,也就是说既要创建对象,还要约束它们之间的关系. ③一系列对象是构建新对象所需要的组成部分,并且对象之间相互有约赖.如电脑由CPU和主板等组成,但CPU的针脚数和主板提供的插口必须是匹配的,否则无法组装. (2)产品族和产品等级 ①产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等

创建型模式--抽象工厂模式

概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.  适用性 1.一个系统要独立于它的产品的创建.组合和表示时. 2.一个系统要由多个产品系列中的一个来配置时. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现时.  参与者 1.AbstractFactory 声明一个创建抽象产品对象的操作接口. 2.ConcreteFactory 实现创建具体产品对象的操作. 3.AbstractProduct 为一

3 创建型模式-----抽象工厂模式

附加概念: 产品等级结构:不同品牌的同一类产品,如Haier电视机,TCL电视机都是电视机,因此属于同一个产品等级结构. 产品族:属于同一个品牌的所有产品,如Haier电视机,Haier冰箱等.   模式动机:工厂方法模式一般针对的是一个产品等级结构(如仅生产电视机),而抽象工厂模式针对的是多个产品等级结构(如不仅生产电视机,还生产空调). 模式定义:一个具体工厂可以创建一个产品族的所有产品,又称为Kit模式. 模式结构图: 模式实例: 一个电器工厂负责生产电视机和空调,其中包括Haier系列和

设计模式01 创建型模式 - 抽象工厂

参考 1. 三种工厂模式的分析以及C++实现|博客园 2. 设计模式之三:抽象工厂模式 | CSDN 3. 浅谈Java设计模式--单实例.简单工厂.抽象工厂.观察者 | CSDN 抽象工厂 为创建一组相关或者相互依赖的对象提供一个接口,而无需指定他们具体的类. 通俗讲,就是创建工厂的工厂,每个工厂都实现抽象工厂,从而决定一个产品族:不同工厂生产不同产品族. 抽象工厂只关心接口,也就是工厂和产品之间的关系,工厂和用户之间的关系,而不关心产品如何实现,而Template和Builder Patte

java设计模式--创建型模式--抽象工厂

什么是抽象工厂,再次学习. 1 抽象工厂 2 概述 3 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 4 5 适用性 6 1.一个系统要独立于它的产品的创建.组合和表示时. 7 8 2.一个系统要由多个产品系列中的一个来配置时. 9 10 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时. 11 12 4.当你提供一个产品类库,而只想显示它们的接口而不是实现时. 13 参与者 14 1.AbstractFactory 15 声明一个创建抽象产品对象的操作接口.

创建型模式 简单工厂模式

创建型模式 简单工厂模式 /** * 创建型模式 简单工厂模式 * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. * * 1.工厂(Creator)角色 * 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类可以被外界直接调用,创建所需的产品对象. * 2.抽象(Product)角色 * 简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口. * 3.具体产品(Concrete P

创建型模式:工厂方法

文章首发创建型模式:工厂方法 简介 姓名:工厂方法 英文名:Factory method Pattern 价值观:扩展是我的专属 个人介绍: Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. (定义一个用于创建对象的接口,让子类决定

6创建型模式之工厂模式与抽象工厂模式

工厂模式 概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 . 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 类图角色和职责 抽象工厂(Creator)角色 工厂方法模式的核心,任何工厂类都必须实现这个接口. 具体工厂( Concrete  Creator)角