当前位置: 首页 > article >正文

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

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 适用性
          • 6. 优点
          • 7. 缺点
          • 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.示例截图
    在这里插入图片描述

http://www.kler.cn/a/305850.html

相关文章:

  • 【leetcode练习·二叉树】用「分解问题」思维解题 II
  • SpringBoot(七)使用mapper注解编写sql操作数据库
  • 51c视觉~合集6
  • 力扣 653. 两数之和 IV 二叉树/binary-tree two-sum IV
  • 机器视觉和计算机视觉的区别
  • Java面试要点02 - 自动装箱与拆箱的原理与性能解析
  • Linux通配符*、man 、cp、mv、echo、cat、more、less、head、tail、等指令、管道 | 、指令的本质 等的介绍
  • 重修设计模式-创建型-建造者模式
  • 基于YOLOv8的遥感光伏板检测系统
  • Vite + Electron 时,Electron 渲染空白,静态资源加载错误等问题解决
  • mysql的监控指标采集
  • 机器学习-------数据标准化
  • 一键生成中秋国风插画!FLUX中秋专属Lora的使用教程
  • 随着Batch size增加,最佳learning rate如何选择?
  • 一个关于Excel的段子
  • 2860. 让所有学生保持开心的分组方法数
  • 模板替换引擎(支持富文本动态表格)
  • 物体识别之微特征识别任务综述
  • Linux文件系统(下)
  • 红黑树前语
  • 存储课程学习笔记5_iouring的练习(io_uring,rust_echo_bench,fio)
  • Unity2D游戏入门
  • [项目][WebServer][解析错误处理]详细讲解
  • JVM字节码
  • MySQL通过备份恢复的方式搭建主从/重建从库
  • 删除Cookie原理