创建型设计模式(二)抽象工厂模式

文章更新时间:2020/07/15

一、一句话背景

  假如我是一个汽车经销商,那我不光是卖车,也得卖相关的配件吧,比如润滑油,轮胎之类的...

  基于这个需求那我能不能整一个抽象的工厂,我需要啥直接告诉这个抽象工厂,具体生产哪一类产品让这个抽象工厂自己去对接,这样我不管需要啥都只用找这个抽象工厂的负责人就可以,而不用找每一类具体产品工厂的负责人,我可就省事多了~

二、使用场景

使用场景:调用一整套产品族的场景。

如:参加不同类型的抽奖活动,QQ换皮肤

优点:抽象工厂可以简单的理解成为其他工厂的总工厂,基于这个概念我们可以把一整套的东西再次进行抽象出来,这样调用起来就更方便了。

缺点:如果抽象工厂功能十分强大时(可创建工厂的种类很多时),工厂类中会有很多无关代码,会显得比较杂乱(工厂类继承抽象工厂,需要实现抽象工厂的抽象方法)

三、模型分析

抽象工厂定义创建抽象产品的方法,由具体工厂去继承,生成具体产品

抽象产品定义产品的共有属性和方法,由具体产品去继承

具体工厂实现/继承工厂类,生产具体产品

具体产品实现/继承抽象产品

四、UML类图

   从UML类图来看,抽象工厂模式工厂方法模式其实大体上是差不多的,他们的区别主要在于:

  区别主要在于产品。

工厂方法模式:

  • 定义一个用于创建对象的接口,让子类决定实例化哪一个类,主要是生成一类相关的产品
  • 工厂模式针对的是产品单一的情况,即一个产品等级结构

抽象工厂模式:

  • 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类,通常生成一系列相关的产品
  • 抽象工厂模式针对的是面向多个业务品种、业务分类,即多个产品等级结构
  • 抽象工厂是在工厂方法的基础上再次提炼出一层更具“通性”的工厂,使生产一类产品变为生产一系列产品

五、代码分析

抽象工厂

/**
 * 汽车工厂【抽象工厂】
 */
public abstract class CarAbstractFactory {
    //组装发动机【抽象产品】
    public abstract Motor packageMotor() throws Exception;

    //组装轮胎【抽象产品】
    public abstract Tyre packageTyre() throws Exception;
}

具体工厂

奥迪工厂 

/**
 * 奥迪工厂【具体工厂】
 */
public class AudiFactory extends CarAbstractFactory {

    //具体的属性
    private Motor motor;
    private Tyre tyre;


    //组装发动机
    @Override
    public Motor packageMotor() throws Exception {
        Motor motor = new AudiMotor();
        this.motor = motor;
        return motor;
    }


    //组装轮胎
    @Override
    public Tyre packageTyre() throws Exception {
        Tyre tyre = new GTYTyre();
        this.tyre = tyre;
        return tyre;
    }

    /**
     * 输出汽车信息
     */
    public void carInfo() {
        System.out.println("=====获得一辆奥迪车,配置如下=====");
        this.motor.motorInfo();
        this.tyre.tyreInfo();
    }

}

奔驰工厂 

/**
 * 奔驰工厂【具体工厂】
 */
public class BenzFactory extends CarAbstractFactory {

    //具体的属性
    private Motor motor;
    private Tyre tyre;


    //组装发动机
    @Override
    public Motor packageMotor() throws Exception {
        Motor motor = new BenzMotor();
        this.motor = motor;
        return motor;
    }


    //组装轮胎
    @Override
    public Tyre packageTyre() throws Exception {
        Tyre tyre = new MQLTyre();
        this.tyre = tyre;
        return tyre;
    }

    /**
     * 输出汽车信息
     */
    public void carInfo() {
        System.out.println("=====获得一辆奔驰车,配置如下=====");
        this.motor.motorInfo();
        this.tyre.tyreInfo();
    }

}

宝马工厂 

/**
 * 宝马车工厂【具体工厂】
 */
public class BmwFactory extends CarAbstractFactory {

    //具体的属性
    private Motor motor;
    private Tyre tyre;


    //组装发动机
    @Override
    public Motor packageMotor() throws Exception {
        Motor motor = new BmwMotor();
        this.motor = motor;
        return motor;
    }


    //组装轮胎
    @Override
    public Tyre packageTyre() throws Exception {
        Tyre tyre = new MQLTyre();
        this.tyre = tyre;
        return tyre;
    }

    /**
     * 输出汽车信息
     */
    public void carInfo() {
        System.out.println("=====获得一辆宝马车,配置如下=====");
        this.motor.motorInfo();
        this.tyre.tyreInfo();
    }
    
}

抽象产品

发动机

/**
 * 发动机【抽象产品】
 */
public abstract class Motor {

    /**
     * 发动机信息
     */
    public abstract void motorInfo();

}

轮胎

/**
 * 轮胎【抽象产品】
 */
public abstract class Tyre {

    /**
     * 轮胎信息
     */
    public abstract void tyreInfo();

}

具体产品

奥迪发动机 

/**
 * 奥迪发动机【具体产品】
 */
public class AudiMotor extends Motor {

    @Override
    public void motorInfo() {
        System.out.println("=====奥迪发动机=====");
        System.out.println("加速:⭐⭐⭐");
        System.out.println("极速:⭐⭐⭐⭐");
    }
}

奔驰发动机 

/**
 * 奔驰发动机【具体产品】
 */
public class BenzMotor extends Motor {

    @Override
    public void motorInfo() {
        System.out.println("=====奔驰发动机=====");
        System.out.println("加速:⭐⭐⭐⭐");
        System.out.println("极速:⭐⭐⭐");
    }
}

宝马发动机 

/**
 * 宝马发动机【具体产品】
 */
public class BmwMotor extends Motor {

    @Override
    public void motorInfo() {
        System.out.println("=====宝马发动机=====");
        System.out.println("加速:⭐⭐⭐⭐⭐");
        System.out.println("极速:⭐⭐⭐⭐");
    }
}

固特异轮胎 

/**
 * 固特异轮胎【具体产品】
 */
public class GTYTyre extends Tyre {

    @Override
    public void tyreInfo() {
        System.out.println("=====固特异轮胎=====");
        System.out.println("耐用指数:⭐⭐⭐⭐");
        System.out.println("抓地力:⭐⭐⭐");
    }
}

米其林轮胎 

/**
 * 米其林轮胎【具体产品】
 */
public class MQLTyre extends Tyre {

    @Override
    public void tyreInfo() {
        System.out.println("=====米其林轮胎=====");
        System.out.println("耐用指数:⭐⭐⭐⭐⭐");
        System.out.println("抓地力:⭐⭐⭐⭐");
    }
}

客户下单

/**
 * 抽象工厂模式测试类【模拟下单】
 */
public class AbstractFactoryTest {
    public static void main(String[] args) throws Exception {
        /*需求:客户要买一辆宝马车*/

        //1、获取宝马工厂
        CarAbstractFactory carFactory = new BmwFactory();
        //2、组装发动机
        carFactory.packageMotor();
        //3、组装轮胎
        carFactory.packageTyre();
        //4、输出车车配置信息
        ((BmwFactory) carFactory).carInfo();
    }
}

原文地址:https://www.cnblogs.com/riches/p/11200185.html