java抽象工厂模式之总有你想不到的知识(代码片段)

流楚丶格念 流楚丶格念     2023-03-15     451

关键词:

文章目录

抽象工厂

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

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

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

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

概念

抽象工厂模式(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策略模式之总有你想不到的知识(代码片段)

文章目录策略模式概念代码示例优缺点策略模式优点策略模式缺点应用场景综合实战:多个算法切换策略模式概念策略模式(StrategyPattern)也叫政策模式,是一种比较简单的模式。它的目的是定义一组算法,... 查看详情

java单例模式之总有你想不到的知识(代码片段)

文章目录Java单例模式概念满足条件两种形式设计要求饿汉模式懒汉方式懒汉式多线程解决方案synchronized双检查锁方式静态内部类枚举(别瞎用)Java单例模式概念单例模式是Java中最简单的设计模式之一。这种类型的设计... 查看详情

java责任链模式之总有你想不到的知识(代码片段)

文章目录责任链模式概念代码案例:优缺点优点缺点应用场景应用案例:多级处理责任链模式概念责任链模式(ChainofResponsibilityPattern)是一种常见的行为模式,它的目的是使多个对象都有机会处理请求,... 查看详情

java观察者模式之总有你想不到的知识(代码片段)

文章目录观察者模式概念代码案例:优缺点优点缺点应用场景观察者模式概念观察者模式(ObserverPattern)也称发布订阅模式,它的目的是定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则... 查看详情

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

文章目录Java单例模式单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式单例模式确保在一个应用程序中某一个类只有一个实例,而且自行实例化并向整个系统提供... 查看详情

java设计模式——工厂模式简单工厂模式工厂方法模式抽象工厂模式(代码片段)

...厂模式传统方式简单工厂模式静态工厂模式工厂方法模式抽象工厂模式工厂模式JDK-Calendar源码分析工厂模式小结简单工厂模式 看一个具体的需求看一个披萨的项目:要便于披萨种类的扩展,要便于维护(1)披萨的种... 查看详情

设计模式---工厂模式(代码片段)

...式的主要优点工厂方法模式的主要缺点适用场景参考文章抽象工厂模式介绍前置知识:产品族,产品等级角色例子优缺点结合例子分析优缺点适用场景抽象工厂模式符合依赖抽象原则参考文章简单工厂模式介绍简单工厂模式属... 查看详情

关于简单工厂模式工厂方法模式和抽象工厂模式的解析(代码片段)

...创建具体实现课程类创建工厂类接口创建具体工厂类测试抽象工厂模式创建笔记和视频接口具体JAVA的笔记和视频创建工厂类接口Java课程工厂实现类测试前言简单工厂模式是由一个工厂对象来决定创建哪一种产品类的实例工厂方... 查看详情

《设计模式奇妙之旅》第3章抽象工厂模式(代码片段)

第3章抽象工厂模式3.1关于抽象工厂模式我们在上面学习了,工厂方法模式,如果我们以前没有正确的使用过面向对象的知识。我们会惊讶工厂方法模式,ohmygad原来还有这种操作。这次我们即将学习的一种设计模式叫... 查看详情

设计模式-抽象工厂模式(代码片段)

返回上一级目录:Java设计模式抽象工厂模式,相对于工厂方法模式来说,抽象工厂模式是用于产品簇的创建,向调用者提供多个系列产品对象。比如一套服饰,有衣服,有鞋,衣服属衣服产品类,鞋属鞋产品类,通过抽象工厂... 查看详情

工厂模式-抽象工厂(代码片段)

1、抽象工厂模式1.1、什么是抽象工厂模式抽象工厂模式是对象的创建模式,是工厂模式的进一步推广。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。“抽象工厂”就是抽象产品角色的工厂。抽象工... 查看详情

设计模式之抽象工厂模式(代码片段)

这个模式看的我有点懵。。。梳理一下先上定义:抽象工厂模式,提供一个创建一系列相关或者依赖对象的接口,而无须指定它们具体的类;不知道我自己在说什么。。1packagecom.java.AbstractFactoryPattern;23publicinterfaceProduct4publicvoidpro... 查看详情

java设计模式之抽象工厂模式(代码片段)

定义:抽象工厂模式指提供一个创建一系列相关或者相互依赖对象的接口,无须指定他们具体的类,意思是客户端不必指定产品的具体类型,创建多个产品族中的产品对象。抽象工厂模式中,客户端不依赖产... 查看详情

简单工厂模式&工厂方法模式&抽象工厂模式的区别(代码片段)

...)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略。这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个设计模式,但很多地方都用到了工厂模式,(如解析xml中,jdbc连接数... 查看详情

抽象工厂模式(代码片段)

一、模式名抽象工厂,AbstractFactory二、解决的问题抽象工厂由“抽象”和"工厂"两个词组成,前者代表了使用了抽象类,后者代表了实现了工厂组装零件的模式。都知道,工厂完成零部件的生产后,再组装成对应的产品,抽象工... 查看详情

抽象工厂模式(代码片段)

抽象工厂模式什么是抽象工厂模式抽象工厂简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品。    抽象工厂,工厂的工厂。  与工厂方法的区别是一组。 具体细分到某个... 查看详情

抽象工厂模式(代码片段)

1、概述抽象工厂模式是一种创建型模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能... 查看详情

设计模式之java----抽象工厂模式(代码片段)

...角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能&#x 查看详情