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

news/2025/11/29 15:02:20/文章来源:https://www.cnblogs.com/yangykaifa/p/19286463

文章目录

      • 简单工厂模式示例
        • 示例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.mzph.cn/news/980856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年衡水高性价比婚恋介绍服务优选排行榜,婚恋介绍哪家性

当代单身群体面临圈子固化、线上社交低效、择偶认知错位等多重脱单难题,部分人还因遭遇婚托婚骗对婚恋机构失去信任。为帮助单身朋友高效锁定靠谱、高性价比的婚恋服务伙伴,我们从服务性价比(收费透明性、服务内容匹…

5-11 关键活动 (30分)

5-11 关键活动 (30分)#include <iostream> #include <vector> #include <queue>using namespace std;struct node {int next, time; };int degree[2][110], t[2][110], maxtime; vector<node>…

实用指南:论多数据源集成的应用与实现

实用指南:论多数据源集成的应用与实现2025-11-29 14:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

5-4 是否同一棵二叉搜索树 (25分)

5-4 是否同一棵二叉搜索树 (25分)#include <iostream>using namespace std;struct node {int lchild, rchild, key; }tree1[10], tree2[10];int index = -1;void initnode(node tree[], int root, int key) {tre…

5-10 公路村村通 (30分)

5-10 公路村村通 (30分)#include <iostream> #include <algorithm>using namespace std;struct edge {int a, b, cost; }e[3010];int sum[1010], tree[1010], res;int cmp(edge e1, edge e2) {return e1.c…

2025年复合肽饮正品公司权威推荐榜单:瘦身复合肽饮品/沙棘肽复合饮品‌/复合肽饮品测评‌源头公司精选

全球肽类健康饮品市场正以每年15%的速度快速增长,2025年市场规模预计突破280亿美元,其中亚太地区成为消费主力,占全球市场份额的45%以上。 复合肽饮作为功能性健康饮品的新兴品类,凭借其易吸收、靶向性强、功能明确…

5-8 File Transfer (25分)

5-8 File Transfer (25分)#include <iostream>using namespace std;int tree[10010], sum[10010];void init(int n) {int i;for(i = 1; i <= n; i++){tree[i] = -1;sum[i] = 1;} }int findroot(int root) {if…

Java/Spring/Dubbo三种SPI机制,到底谁更好?

Java SPI、Spring SPI、Dubbo SPI 并非简单的 “谁更好”,而是各有设计初衷、适配场景与优缺点,选择的核心在于业务需求(如是否需 Spring 生态、是否追求扩展性 / 性能、是否涉及分布式场景)。以下从设计原理、特性…

5-7 六度空间 (30分)

5-7 六度空间 (30分)#include <iostream> #include <vector> #include <queue> #include <string.h>using namespace std;vector<int> v[10010]; queue<int> q; int vis[10010], …

2025年衡水口碑不错的高性价比婚恋介绍专业企业排行榜,婚恋

为帮衡水单身男女高效锁定适配自身需求的婚恋服务合作伙伴,避免遭遇婚托婚骗、服务低效等问题,我们从合规资质(如行业准入许可、诚信认证)、匹配成功率(含脱单周期、客户满意度)、服务性价比(覆盖会员费定价、增…

nginx限流

Nginx 限流测试完全指南 一、快速开始 1. Nginx 配置(http 块) http{set_real_ip_from 100.127.0.0/16; # 腾讯云 CLB 实际使用的网段set_real_ip_from 10.206.0.0/24; # 保留原有的(如果有用)real_ip_head…

2025年稳定性法兰工厂权威推荐榜单:钢衬活套法兰/一体法兰‌/PPH法兰‌源头工厂精选

在工业管道系统复杂度不断提升的背景下,全球法兰市场规模预计在2025年将突破200亿元,其中对高稳定性、高密封性法兰的需求增速尤为显著。 工业管道系统作为各行业的血脉,其连接可靠性直接关系到整个生产系统的安全与…

5-3 树的同构 (25分)

5-3 树的同构 (25分)#include <iostream> #include <string.h>using namespace std;struct node {int lchild, rchild;char key; }tree1[10], tree2[10];int flag[10];int getindex(char ch) {if(ch == -)…

2025西安网站建设公司推荐3家口碑好的网站制作公司

2025 西安网站建设公司推荐 3 家口碑好的网站制作公司随着西安数字经济加速发展,企业对 “官网名片” 的重视程度持续提升,专业的网站建设、网站制作与网页设计服务,成为企业拓展线上业务、塑造品牌形象的核心支撑。…

2025年高性价比超高频感应加热设备供应商排行榜,值得推荐的

为帮助制造企业精准锁定适配自身生产需求的超高频感应加热设备合作伙伴,避开选型陷阱,我们从技术核心竞争力(如感应加热效率、控温精度)、产品性价比优势(含能耗成本控制、长期运维成本)、定制化服务能力(覆盖非…

2025年污泥脱水机生产厂哪家售后好?TOP5推荐,专业设备

在环保监管趋严与绿色转型的双重推动下,污泥脱水机作为工业污水与市政污泥处理的核心设备,其性能稳定性与售后服务质量直接关系到企业的合规运营与成本控制。面对市场上鱼龙混杂的供应商,企业如何选择设备靠谱、售后…

NOIP2025 游记——希望不要是尾声

出场估分:\(100+100+48+[50,75]\)。这是流水账版,之后可能会写点 emotional 的东西。 总结一下:没有完全发挥出上限,但是保住了下限(前提是不挂大分)。T3 没有拼上 \(m\leq 2\) 还是有点可惜。T4 没有去刻意判 A…

2025年中央回转接头生产厂家权威推荐榜单:回转接头/中央回转体‌/起重机中心回转接头‌源头厂家精选

随着中国工程机械产业持续发展,中央回转接头作为液压系统的核心部件,其市场规模预计在2025年将达到87亿元,年增长率稳定在12%左右。 中央回转接头是工程机械、矿山设备和起重设备中不可或缺的关键部件,其性能直接影…

2025超高频感应加热装置TOP5实力企业推荐:专业度与案例

随着制造业对金属热处理精度、能效要求的提升,超高频感应加热装置因秒级加热、局部精准控温的优势成为核心装备,其市场年增速超30%。但行业中存在设备稳定性差、能耗高等问题,超30%企业因选品不当导致废品率上升15%…

2025网红景区空中飞艇制造厂商TOP5权威推荐:甄选专业供

近年来,无动力游乐设备成为景区流量密码,空中飞艇凭借高空观光与刺激体验的双重属性,成网红景区必争的爆款项目。但市场上供应商资质参差不齐,部分小厂存在材料劣质、安全无保障、售后缺失等问题,甚至因设计不合规…