Java抽象工厂模式之总有你想不到的知识

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java抽象工厂模式之总有你想不到的知识相关的知识,希望对你有一定的参考价值。

文章目录

抽象工厂

使用工厂方法模式足以应付我们可能遇到的大部分业务需求。

但是当产品种类非常多时,就会出现 大量的与之对应的工厂类,这不应该是我们所希望的。所以建议在这种情况下使用简单工厂模式与工厂 方法模式相结合的方式来减少工厂类:

  • 对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现
  • 如果产品树上涉及多个产品族,则可以使用抽象工厂模式

下面我们来详细看一下抽象工厂:

概念

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

首先我们要理解产品族和产品等级:

  • 产品族:一个品牌下面的所有产品;例如奥迪下面的商务型、MINI型称为华为的产品族;

  • 产品等级:多个品牌下面的同种产品;例如奥迪和宝马下面的各种商务车型,称为一个产品等级;

抽象工厂模式的各个角色和工厂方法的如出一辙:

角色说明
抽象工厂角色这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的 父类。在java中它由抽象类或者接口来实现
具体工厂角色它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它 由具体的类来实现
抽象产品角色它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现
具体产品角色具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现

优缺点

优点

抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展

缺点

抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这就违背了"开闭原则"。

适用场景

使用抽象工厂模式的系统应该符合以下几个条件:

  • 一个系统不要求依赖产品实例如何被创建、组合和表达
  • 这个系统有多个系列产品,而系统中只消费其中某一系列产品
  • 系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现

下面我们实现一个案例来分析一下

代码案例

以生产不同厂牌生产不同车型为例子:

  • 有商务车和MINI型车 两种产品,定义两个接口;
  • 奔驰、奥迪、宝马都可以生产这两种产品,所以有6(2*3)个实现类;
  • 现在需要创建奔驰、奥迪、宝马的工厂类,先将工厂类进行抽象,里面有创建两个产品的方法,返回的是产品的接口类;
  • 创建奔驰、奥迪、宝马的工厂实现类,继承工厂类接口,实现创建各自产品的方法;
  • 客户端调用时,直接用工厂接口类创建需要的工厂,拿到对应的型号的产品;

类图分析:

代码如下:

商务车抽象产品族:BusinessCar

package com.shixun.design.factory.abstract_factory;

import com.shixun.design.factory.Car;

/**
 * 抽象产品族(BusinessCar)
 */
public interface BusinessCar extends Car 
    boolean isAutoDoor();


MINI车抽象产品族:SportCar

package com.shixun.design.factory.abstract_factory;

import com.shixun.design.factory.Car;

/**
 * 抽象产品族(SportCar)
 */
public interface SportCar extends Car 
    boolean isStrong();


AodiBusinessCar

package com.shixun.design.factory.abstract_factory;

/**
 * 新业务奥迪商务汽车
 */
public class AodiBusinessCar implements BusinessCar 
    @Override
    public boolean isAutoDoor() 
        return false;
    

    @Override
    public void show() 
        System.out.println("我是Aodi的商务汽车");
    


AodiSportCar

package com.shixun.design.factory.abstract_factory;

/**
 * 新业务奥迪运动汽车
 */
public class AodiSportCar implements SportCar 
    @Override
    public boolean isStrong() 
        return false;
    

    @Override
    public void show() 
        System.out.println("我是Aodi的运动汽车");
    


BenzBusinessCar

package com.shixun.design.factory.abstract_factory;

/**
 * 具体产品(BenzBusinessCar)
 */
public class BenzBusinessCar implements BusinessCar 
    @Override
    public boolean isAutoDoor() 
        return true;
    

    @Override
    public void show() 
        System.out.println("我是Benz的商务汽车");
    


BenzSportCar

package com.shixun.design.factory.abstract_factory;

/**
 * 具体产品(BenzSportCar)
 */
public class BenzSportCar implements SportCar 
    @Override
    public boolean isStrong() 
        return true;
    

    @Override
    public void show() 
        System.out.println("我是Benz的运动汽车");
    


BmwBusinessCar

package com.shixun.design.factory.abstract_factory;

/**
 * 具体产品(BmwBusinessCar)
 */
public class BmwBusinessCar implements BusinessCar 
    @Override
    public boolean isAutoDoor() 
        return true;
    

    @Override
    public void show() 
        System.out.println("我是Bmw的商务汽车");
    


BmwSportCar

package com.shixun.design.factory.abstract_factory;

/**
 * 具体产品(BmwSportCar)
 */
public class BmwSportCar implements SportCar 
    @Override
    public boolean isStrong() 
        return true;
    

    @Override
    public void show() 
        System.out.println("我是Bmw的运动汽车");
    


生产的抽象工厂:CarFactory

定义两个接口方法:

  • 生产商务车
  • 生产MINI车
package com.shixun.design.factory.abstract_factory;

/**
 * 抽象工厂
 */
public interface CarFactory 
    /**
     * 生产运动汽车
     *
     * @return
     */
    SportCar produceSportCar();

    /**
     * 生产商务汽车
     *
     * @return
     */
    BusinessCar produceBusinessCar();


AodiCarFactory

package com.shixun.design.factory.abstract_factory;

/**
 * 新业务工厂AodiCarFactory
 */
public class AodiCarFactory implements CarFactory 
    @Override
    public SportCar produceSportCar() 
        return new AodiSportCar();
    

    @Override
    public BusinessCar produceBusinessCar() 
        return new AodiBusinessCar();
    


BmwCarFactory

package com.shixun.design.factory.abstract_factory;

/**
 * 具体工厂(BenzCarFactory)
 */
public class BenzCarFactory implements CarFactory 
    @Override
    public SportCar produceSportCar() 
        return new BenzSportCar();
    

    @Override
    public BusinessCar produceBusinessCar() 
        return new BenzBusinessCar();
    


BenzCarFactory

package com.shixun.design.factory.abstract_factory;

/**
 * 具体工厂(BmwCarFactory)
 */
public class BmwCarFactory implements CarFactory 
    @Override
    public SportCar produceSportCar() 
        return new BmwSportCar();
    

    @Override
    public BusinessCar produceBusinessCar() 
        return new BmwBusinessCar();
    


编写测试类:

package com.shixun.design.factory.abstract_factory;

/**
 * 使用者
 */
public class Test 
    public static void main(String[] args) 
        //生产Bmw
        BmwCarFactory bmwCarFactory = new BmwCarFactory();
        //宝马运动
        SportCar bmwSportCar = bmwCarFactory.produceSportCar();
        System.out.println("宝马运动strong:" + bmwSportCar.isStrong());
        bmwSportCar.show();
        //宝马商务
        BusinessCar bmwBusinessCar = bmwCarFactory.produceBusinessCar();
        System.out.println("宝马商务autoDoor:" + bmwBusinessCar.isAutoDoor());
        bmwBusinessCar.show();
        //生产Benz
        BenzCarFactory benzCarFactory = new BenzCarFactory();
        //奔驰运动
        SportCar benzSportCar = benzCarFactory.produceSportCar();
        System.out.println("奔驰运动strong:" + benzSportCar.isStrong());
        benzSportCar.show();
        //奔驰商务
        BusinessCar benzBusinessCar = benzCarFactory.produceBusinessCar();
        System.out.println("奔驰自动autoDoor:" + benzBusinessCar.isAutoDoor());
        benzBusinessCar.show();

        //新业务
        //生产Aodi
        AodiCarFactory aodiCarFactory = new AodiCarFactory();
        //奥迪运动
        SportCar aodiSportCar = aodiCarFactory.produceSportCar();
        System.out.println("奥迪运动strong:" + aodiSportCar.isStrong());
        aodiSportCar.show();
        //奥迪商务
        BusinessCar aodiBusinessCar = aodiCarFactory.produceBusinessCar();
        System.out.println("奥迪自动autoDoor:" + aodiBusinessCar.isAutoDoor());
        aodiBusinessCar.show();
    


运行结果如下:

以上是关于Java抽象工厂模式之总有你想不到的知识的主要内容,如果未能解决你的问题,请参考以下文章

Java策略模式之总有你想不到的知识

Java单例模式之总有你想不到的知识

Java单例模式之总有你想不到的知识

Java责任链模式之总有你想不到的知识

Java观察者模式之总有你想不到的知识

一抽象工厂模式&&简单工厂+反射改进抽象工厂