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

【设计模式笔记10】:简单工厂模式示例 - 详解

文章目录

      • 简单工厂模式示例
        • 示例1:电视机工厂
        • 示例2:图表库工厂
      • 在JDK中的应用:`java.util.Calendar`

简单工厂模式示例

示例1:电视机工厂

接续上一节的电视机场景,我们来看一个完整的代码实现。

示例2:图表库工厂
  • 背景需求:

    • Sunny软件公司要开发一套图表库,提供柱状图、饼状图、折线图等不同外观的图表。
    • 设计目标是为应用系统开发者提供一套灵活易用的图表库,并且可以较为方便地对图表库进行扩展,以便将来增加新类型的图表。
  • 初始设计 (反面教材):

    • 最初,可能将所有图表的创建和显示逻辑都耦合在一个Chart类中。
    // 违反单一职责和开闭原则的设计
    public class Chart {
    private String type; // 图表类型
    // 构造函数中根据类型进行不同的初始化
    public Chart(Object[][] data, String type) {
    this.type = type;
    if (type.equalsIgnoreCase("histogram")) {
    // 初始化柱状图
    } else if (type.equalsIgnoreCase("pie")) {
    // 初始化饼状图
    } else if (type.equalsIgnoreCase("line")) {
    // 初始化折线图
    }
    }
    // 显示方法中根据类型进行不同的显示
    public void display() {
    if (this.type.equalsIgnoreCase("histogram")) {
    // 显示柱状图
    } else if (this.type.equalsIgnoreCase("pie")) {
    // 显示饼状图
    } else if (this.type.equalsIgnoreCase("line")) {
    // 显示折线图
    }
    }
    }
    • 问题分析: 这个Chart类职责过重,既负责创建(初始化)又负责显示。而且,每当需要增加一种新的图表类型时,都必须修改这个类的构造函数和display方法,违反了开闭原则
  • 使用简单工厂模式重构:

    • 模式角色分析:
      • 抽象产品 (Product): Chart 接口,定义所有图表都必须具备的 display() 方法。
      • 具体产品 (ConcreteProduct): HistogramChart, PieChart, LineChart 等类,分别实现Chart接口,负责各自图表的具体显示逻辑。
      • 工厂 (Factory): ChartFactory 类,提供一个静态方法 getChart(String type),根据传入的类型字符串创建并返回具体的图表对象。
  • 重构后代码实现:

    // 抽象产品:Chart接口
    public interface Chart {
    public void display();
    }
    // 具体产品:HistogramChart, PieChart, LineChart 类(代码略,各自实现display方法)
    // 工厂类:ChartFactory
    public class ChartFactory {
    // 静态工厂方法
    public static Chart getChart(String type) {
    Chart chart = null;
    if (type.equalsIgnoreCase("histogram")) {
    chart = new HistogramChart();
    System.out.println("初始化设置柱状图!");
    } else if (type.equalsIgnoreCase("pie")) {
    chart = new PieChart();
    System.out.println("初始化设置饼状图!");
    } else if (type.equalsIgnoreCase("line")) {
    chart = new LineChart();
    System.out.println("初始化设置折线图!");
    }
    return chart;
    }
    }
  • 客户端调用:

    class Client {
    public static void main(String[] args) {
    Chart chart;
    // 客户端通过工厂获取实例,实现了创建和使用的分离
    chart = ChartFactory.getChart("line");
    chart.display(); // 调用产品的功能
    }
    }
  • 运行效果:

    初始化设置折线图!
    显示折线图!

在JDK中的应用:java.util.Calendar

简单工厂模式(静态工厂方法)在Java的JDK源码中也有广泛应用。一个典型的例子就是java.util.Calendar类。

  • 源码分析:

    • 我们获取Calendar实例时,并不是通过new Calendar()Calendar是抽象类,无法直接new),而是通过调用它的静态方法 Calendar.getInstance()
    import java.util.Calendar;
    public class Factory {
    public static void main(String[] args) {
    // getInstance() 就是一个静态工厂方法
    Calendar cal = Calendar.getInstance();
    System.out.println("年: " + cal.get(Calendar.YEAR));
    // 月份从0开始,需要+1
    System.out.println("月: " + (cal.get(Calendar.MONTH) + 1));
    System.out.println("日: " + cal.get(Calendar.DAY_OF_MONTH));
    }
    }
  • 内部机制:

    • getInstance() 方法会根据系统当前的区域设置(Locale)和时区(TimeZone)等信息,在内部决定具体创建并返回哪一个Calendar的子类实例(例如,在大多数情况下是GregorianCalendar)。
    • 这样,客户端代码完全不需要关心底层具体使用的是哪种日历实现,只需要与Calendar这个抽象类进行交互即可。这极大地提高了代码的灵活性和可维护性。
http://www.zskr.cn/news/65164.html

相关文章:

  • 5-11 关键活动 (30分)
  • 5-8 File Transfer (25分)
  • 2025年复合肽饮正品公司权威推荐榜单:瘦身复合肽饮品/沙棘肽复合饮品‌/复合肽饮品测评‌源头公司精选
  • nginx限流
  • 5-3 树的同构 (25分)
  • 2025西安网站建设公司推荐3家口碑好的网站制作公司
  • NOIP2025 游记——希望不要是尾声
  • 武汉汽车后市场线上代运营公司排名推荐,武汉车视界信息服务有限
  • 2025网红景区空中飞艇制造厂商TOP5权威推荐:甄选专业供
  • Google生成式UI下一代人机交互技术
  • 2025年广东机器人服务商研发生产厂家推荐:广东知名机器人研
  • 完整教程:座舱出行Agent实战(三):专能化架构如何实现效率与稳定性的双重飞跃
  • 【AI翻译】什么是第三方API?优势、应用场景与最佳实践
  • 2025年度太原成人电气自动化培训班口碑推荐,专业介绍与初级
  • 在AI技术唾手可得的时代,挖掘新需求成为制胜关键——某知名AI开发工具需求洞察
  • 2025年波纹伸缩软管厂家权威推荐榜单:暖通管道软管/高压法兰软管‌/沉降软管‌源头厂家精选
  • 2025年玻璃钢厂家权威推荐榜单:玻璃钢夹砂管道/一体化泵站/模压化粪池源头厂家精选
  • 2025年新疆电线电缆厂家权威推荐榜单:电力电缆/高温电缆/矿用电缆源头厂家精选
  • Tokenizer学习心得
  • 待办事项全栈搭建:Vue3 + Node.js (Koa) + MySQL深度整合,构建生产级任务管理系统的技术实践
  • AI股票预测分析报告 - 2025年11月29日
  • AI元人文:论数字猴戏与缺失的“破茧之悟”
  • 01-框架概述与设计理念
  • 电力电缆厂家TOP5权威推荐:甄选质量过硬、客户反馈佳的供应
  • 2025年工业冷风机节能效率排行榜出炉,炼胶车间通风降温/制造业车间通风降温/机械厂车间降温/炼钢车间通风降温工业冷风机厂商选哪家
  • 2025年空调机组厂家最新推荐,组合式,直膨式净化,变风量,远程射流,转轮热回收空调机组公司测评
  • 深入解析:SSH 密钥从 RSA 到 Ed25519
  • 2025年十大乡村别墅设计服务排行榜,新测评精选设计公司推荐
  • Kafka入门:从初识到Spring Boot实战
  • 2025年浙江电子汽车衡年度排名:电子汽车衡制造商、诚信的防