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

目录

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

相关推荐
小白不太白95012 小时前
设计模式之 模板方法模式
java·设计模式·模板方法模式
色空大师13 小时前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)13 小时前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
博风13 小时前
设计模式:6、装饰模式(包装器)
设计模式
A_cot13 小时前
理解设计模式与 UML 类图:构建稳健软件架构的基石
microsoft·设计模式·简单工厂模式·工厂方法模式·uml
君败红颜14 小时前
设计模式之创建模式篇
设计模式
闲人一枚(学习中)17 小时前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
小白不太白95019 小时前
设计模式之 观察者模式
观察者模式·设计模式
小白不太白95020 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
吾与谁归in20 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式