【软考】设计模式之抽象工厂模式

目录

          • [1. 说明](#1. 说明)
          • [2. 应用场景](#2. 应用场景)
          • [3. 结构图](#3. 结构图)
          • [4. 构成](#4. 构成)
          • [5. 适用性](#5. 适用性)
          • [6. 优点](#6. 优点)
          • [7. 缺点](#7. 缺点)
          • [8. java示例](#8. java示例)
1. 说明
  • 1.提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
  • 2.抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式。
  • 3.抽象工厂模式用于系统的产品族,而不仅仅是一个等级结构;一个等级的抽象类只能创建一个等级的产品,而抽象工厂模式能创建多个等级的产品。
2. 应用场景
  • 1.当一个系统不应当依赖于产品类实例如何被创建、组合和表示的细节时。
  • 2.当系统中有多于一个的产品族,而每次只使用其中某一产品族时。
  • 3.属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  • 4.系统提供一个产品类的库,并希望系统的设计独立于这些产品的实现时。
3. 结构图
4. 构成
  • 1.抽象工厂(Abstract Factory):声明一个创建产品对象的接口,但由子类决定要实例化的产品是哪一个。工厂方法通常返回该产品的抽象类型。
  • 2.具体工厂(Concrete Factory):实现了抽象工厂接口的具体类,负责实例化产品对象。
  • 3.抽象产品(Abstract Product):为每种产品声明接口,在抽象产品中定义了产品的抽象方法。
  • 4.具体产品(Concrete Product):实现了抽象产品接口的具体类。
5. 适用性
  • 1.一个系统要独立于它的产品的创建、组合和表示时。
  • 2.一个系统要由多个产品系列中的一个来配置时。
  • 3.当要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 4.当提供一个产品类库,只想显示它们的接口而不是实现时。
6. 优点
  • 1.抽象工厂模式隔离了具体类的生成,使得客户不需要知道什么被创建。
  • 2.增加一个新的产品族很方便,无需修改已有系统,符合开闭原则。
7. 缺点
  • 1.增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对"开闭原则"的支持呈现倾斜性。
  • 2.使用抽象工厂模式会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。
8. java示例
  • 1.抽象产品 食物

    package com.learning.factory.abstract_factory.example;

    /**

    • 抽象产品:食物
      */

    public interface Food {
    void prepare();
    }

  • 2.抽象产品 饮料

    package com.learning.factory.abstract_factory.example;

    /**

    • 抽象产品:饮料
      */
      public interface Drink {
      void serve();
      }
  • 3.具体产品 中餐食物

    package com.learning.factory.abstract_factory.example;

    /**

    • 具体产品:中餐食物
      */
      public class ChineseFood implements Food {
      @Override
      public void prepare() {
      System.out.println("准备中餐食物");
      }
      }
  • 4.具体产品 中餐饮料

    package com.learning.factory.abstract_factory.example;

    /**

    • 具体产品:中餐饮料
      */

    public class ChineseDrink implements Drink {
    @Override
    public void serve() {
    System.out.println("供应中餐饮料");
    }
    }

  • 5.具体产品 西餐食物

    package com.learning.factory.abstract_factory.example;

    /**

    • 具体产品:西餐食物
      */
      public class WesternFood implements Food {
      @Override
      public void prepare() {
      System.out.println("准备西餐食物");
      }
      }
  • 6.具体产品 西餐饮料

    package com.learning.factory.abstract_factory.example;

    /**

    • 具体产品:西餐饮料
      */
      public class WesternDrink implements Drink {
      @Override
      public void serve() {
      System.out.println("供应西餐饮料");
      }
      }
  • 7.抽象工厂

    package com.learning.factory.abstract_factory.example;

    /**

    • 抽象工厂
      /
      public interface RestaurantFactory {
      /
      *

      • 创建食物
      • @return
        */
        Food createFood();

      /**

      • 创建饮料
      • @return
        */
        Drink createDrink();
        }
  • 8.具体工厂 中餐工厂

    package com.learning.factory.abstract_factory.example;

    /**

    • 具体工厂:中餐工厂
      */
      public class ChineseRestaurantFactory implements RestaurantFactory {
      @Override
      public Food createFood() {
      return new ChineseFood();
      }

      @Override
      public Drink createDrink() {
      return new ChineseDrink();
      }
      }

  • 9.具体工厂 西餐工厂

    package com.learning.factory.abstract_factory.example;

    /**

    • 具体工厂:西餐工厂
      */
      public class WesternRestaurantFactory implements RestaurantFactory {
      @Override
      public Food createFood() {
      return new WesternFood();
      }

      @Override
      public Drink createDrink() {
      return new WesternDrink();
      }
      }

  • 10.客户端

    package com.learning.factory.abstract_factory.example;

    /**

    • 客户端
      */
      public class RestaurantClient {
      public static void main(String[] args) {
      // 使用中餐工厂
      RestaurantFactory chineseFactory = new ChineseRestaurantFactory();
      Food chineseFood = chineseFactory.createFood();
      chineseFood.prepare();

      复制代码
       Drink chineseDrink = chineseFactory.createDrink();  
       chineseDrink.serve();  
      
       // 使用西餐工厂  
       RestaurantFactory westernFactory = new WesternRestaurantFactory();  
       Food westernFood = westernFactory.createFood();  
       westernFood.prepare();  
      
       Drink westernDrink = westernFactory.createDrink();  
       westernDrink.serve();  

      }
      }

  • 11.示例截图

相关推荐
basketball61611 小时前
软考中级网络工程师 第4章 无线通信网 备考总结
linux·服务器·网络·网络工程师·软考
George_Ye11 小时前
同一本书,一人一份:我如何设计 AI 个性化扫书报告
设计模式
一米阳光866112 小时前
软考(中级)软件设计师核心笔记(8)数据结构——线性结构、数组、矩阵
数据结构·笔记·职场发展·软考·软件设计师·中级职称
莫得感情 o20 小时前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
@insist1231 天前
系统集成项目管理工程师-安全架构与云原生架构
云原生·架构·软考·安全架构·系统集成项目管理工程师·软考中项·软件水平考试
basketball6161 天前
软考中级网络工程师 第1章 计算机网络概论 备考总结
网络工程师·软考
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu2 天前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏2 天前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术2 天前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试