建立型模式:抽象工厂

我的博客原文:
建立型模式:抽象工厂java

景

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

简介

姓名 :抽象工厂github

英文名 :Abstract Factory Pattern设计模式

价值观 :无论你有多少产品,给我就是了ide

我的介绍设计

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
为建立一组相关或相互依赖的对象提供一个接口,并且无须指定它们的具体类。
(来自《设计模式之禅》)code

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

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

你要的故事

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

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 设计模式》

推荐阅读:
建立型模式:单例模式
建立型模式:工厂方法

但愿文章对您有所帮助,设计模式系列会持续更新,感兴趣的同窗能够关注公众号,第一时间获取文章推送阅读,也能够一块儿交流,交个朋友。

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

公众号

相关文章
相关标签/搜索