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

目录

          • [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.示例截图

相关推荐
李广坤12 小时前
状态模式(State Pattern)
设计模式
李广坤13 小时前
观察者模式(Observer Pattern)
设计模式
李广坤14 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤14 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤14 小时前
解释器模式(Interpreter Pattern)
设计模式
阿无,17 小时前
java23种设计模式之前言
设计模式
Asort18 小时前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机18 小时前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の21 小时前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom1 天前
[C++] --- 常用设计模式
开发语言·c++·设计模式