简单工厂模式设计实验

实验内容:

        楚锋软件公司欲基于Java 语言开发一套图表库,该图表库可以为应用系统提供各种不同外观的图表,例如柱状图、饼状图、折线图等。楚锋软件公司图表库设计人员希望为应用系统开发人员提供一套灵活易用的图表库,而且可以较为方便地对图表库进行扩展,以便能够在将来增加一些新类型的图表。

        楚锋软件公司图表库设计人员提出了一个初始设计方案,将所有图表的实现代码封装在一个Chart类中,其框架代码如下:

客户端代码通过调用 Chart 类的构造函数来创建图表对象,根据参数 type 的不同可以得到不同类型的图表,然后再调用 display() 方法来显示相应的图表。

不难看出,Chart 类是一个“巨大的”类,在该类的设计中存在以下几个问题:         

(1)在 Chart 类中包含很多“if···else..”代码块,整个类的代码相当冗长,代码越长,阅读难度、维护难度和测试难度也越大;而且大量条件语句的存在还将影响系统的性能,程序在执行过程中需要做大量的条件判断。

(2)Chart 类的职责过重,它负责初始化和显示所有的图表对象,将各种图表对象的初始化代码和显示代码集中在一个类中实现,违反了单一职责原则,不利于类的重用和维护,而且将大量的对象初始化代码都写在构造函数中将导致构造函数非常庞大,对象在创建时需要进行条件判断,降低了对象创建的效率。

(3)当需要增加新类型的图表时,必须修改 Chart 类的源代码违反了开闭原则。

(4)客户端只能通过 new 关键字来直接创建 Chart 对象,Chart 类与客户端类合度较高,对象的创建和使用无法分离。

(5)客户端在创建 Chart 对象之前可能还需要进行大量初始化设置,例如设置柱状图的颜色、高度等,如果在 Chart 类的构造函数中没有提供一个默认设置,那就只能由客户端来完成初始设置,这些代码在每次创建 Chart 对象时都会出现,导致代码的重复。

面对上面的设计,请使用简单工厂模式对上面的代码进行重构。请给出设计类图,以及对应的 Java 代码(包括客户端的调用代码)

实验解析:
(1)UML类图

(2)Java代码:
 public interface Chart {public void display();
}public class HistogramChart implements Chart {public HistogramChart(){System.out.println("创建柱状图。");}public void display(){System.out.println("显示柱状图!");}    
}public class PieChart implements Chart {public PieChart(){System.out.println("创建饼状图。");}public void display(){System.out.println("显示饼状图!");}    
}public class LineChart implements Chart {public LineChart(){System.out.println("创建折线图。");}public void display(){System.out.println("显示折线图!");}    
}public class ChartFactory {//静态工厂方法public static Chart createChart(String args){Chart chart = null;if (args.equalsIgnoreCase("histogram")){chart = new HistogramChart();System.out.println("初始化设置柱状图!");}else if (args.equalsIgnoreCase("pie")){chart = new PieChart();System.out.println("初始化设置饼状图!");}else if (args.equalsIgnoreCase("line")){chart = new LineChart();System.out.println("初始化设置折线图!");}return chart;}
}public class Client {public static void main(String[] args) {Chart chart=ChartFactory.createChart("histogram");chart.display();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/310017.html

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

相关文章

【Linux学习】初识Linux指令(二)

文章标题 1.rm 指令2.man指令3.nano指令4.cp指令5.mv指令6.alias指令7. cat与8.echo指令 ⚶文章简介 ⚶本篇文章继上篇文章Linux指令讲解,本篇文章主要会涉及到的指令会有:rm指令与 *(通配符)的搭配使用,man指令&…

找出mongodb的jumbo块并进行分裂

https://www.cnblogs.com/abclife/p/15968628.html 根据这篇文档中的脚本,在我们自己的环境中跑了下,第一次跑的结果如下: 运行完上面跑出的split脚本后,还是存在jumbo块,第二次跑出的结果: 从上面结果可以…

深入探索:Zookeeper+消息队列(kafka)集群

目录 前言 一、Zookeeper概述 1、Zookeeper概念 2、Zookeeper 特点 3、Zookeeper工作机制 4、Zookeeper 选举机制 4.1 第一次启动选举机制 4.2 非第一次启动选举机制 5、Zookeeper 数据结构 6、Zookeeper 应用场景 二、部署 Zookeeper 集群 1、环境部署 2、安装 z…

【HTML】简单制作一个动态变色光束花

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言,本文将详细介绍一段代码,具体内容如下: 开始 首先新建文件夹,创建一个文本文档,其中HTML的文件名改为[index.html]&a…

比特币突然暴跌

作者:秦晋 周末愉快。 今天给大家分享两则比特币新闻,也是两个数据。一则是因为中东地缘政治升温,传统资本市场的风险情绪蔓延至加密市场,引发加密市场暴跌。比特币跌至66000美元下方。杠杆清算金额高达8.5亿美元。 二则是&#x…

交流电子负载解决方案

交流电子负载是一种可以模拟真实负载的设备,它可以接收交流电源输入,并以一定的电流和电压进行输出。这种设备在电力系统、电子设备研发、生产和质量控制等多个领域都有广泛的应用。以下是一些关于交流电子负载解决方案的建议。 选择合适的设备&#xff…

锁策略总结

锁策略 悲观锁和乐观锁 乐观锁和悲观锁不是具体类型的锁而是指两种不同的对待加锁的态度,这两个锁面对锁冲突的态度是相反的。 乐观锁:认为不存在很多的并发操作,因此不需要加锁。悲观锁:认为存在很多并发操作,因此需…

FPGA - 以太网UDP通信(二)

一,引言 前文链接:FPGA - 以太网UDP通信(一) 在上文章中介绍了以太网简介,以太网UDP通信硬件结构,以及PHY芯片RGMII接口-GMII接口转换逻辑,接下来介绍UDP通信结构框图以及数据链路层&#xff…

【详细讲解下Photoshop】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

MySQL练习题

有三个表,表S(学生表),C(课程表),SSC(学生选课表) S(SNO,SNAME)代表(学号,姓名) C&#xf…

[MySQL]数据库原理8——喵喵期末不挂科

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

NVM的安装与配置

目录 一、简介二、下载2.1、windows环境下载地址2.2、安装 三、配置3.1、查看可安装版本3.2、安装版本3.3、使用和切换版本3.4、模块配置 四、其他4.1、全局安装pnpm4.2、常用nvm命令 一、简介 NVM,全称为Node Version Manager,是一个流行的命令行工具&a…

k8s控制器(五)_____DaemonSet

DaemonSet控制器 DaemonSet控制器是Kubernetes中的一种控制器,用于确保集群中的每个节点都运行一个Pod的副本。它通常用于在整个集群中部署一些系统级别的服务: 在每一个node节点运行一个存储服务,例如gluster,ceph。在每一个no…

模型预测控制MPC(2)—— 无约束线性MPC

前文:模型预测控制MPC(1)—— 基础概念参考:模型预测控制(2022春)本文从偏控制的角度介绍无约束线性MPC方法, x , u , J x,u,J x,u,J 分别代表状态、动作和代价函数 文章目录 1. 问题定义1.1 多…

P2P通信基本原理

在数字世界的脉络中,点对点(P2P)技术如同一条悄无声息的河流,流经信息的每个角落,连接着世界各地的计算机和设备。这种去中心化的网络模型,不仅打破了传统的客户端-服务器架构的界限,还赋予了数…

DC-5渗透测试复现

DC-5渗透测试复现 目的: 获取最高权限以及5个flag 过程: 信息打点-文件包含漏洞-弹shell- scren-4.0.5提权 环境: 攻击机:kali(192.168.85.136) 靶机:DC_3(192.168.85.134) 复现: 一.信息收集 nma…

DC-2渗透测试复现

DC-2渗透测试复现 目的: 获取最高权限以及5个flag 过程: 信息打点-ssh连接-git提权 环境: 攻击机:kali(192.168.85.136) 靶机:DC_2(192.168.85.132) 复现: 一.信息收集 nmap -sP 192.168.85.0/24 …

element问题总结之el-table使用fixed固定列后滚动条滑动到底部或者最右侧的时候错位问题

el-table使用fixed固定列后滚动条滑动到底部或者最右侧的时候错位 效果图前言解决方案纵向滑动滚动条滑动到底部的错位解决横向滚动条滑动到最右侧的错位解决 效果图 前言 在使用el-table固定行的时候移动滚动条会发现移动到底部或者移动到最右侧的时候会出现表头和内容错位或…

头歌-机器学习 第9次实验 随机森林

第1关:Bagging 任务描述 本关任务:补充 python 代码,完成 BaggingClassifier 类中的 fit 和 predict 函数。请不要修改 Begin-End 段之外的代码。 相关知识 为了完成本关任务,你需要掌握: 什么是 Bagging&#xf…

Day37:LeedCode 738.单调递增的数字 968.监控二叉树 蓝桥杯 翻转

738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9 思路: 假设这个数是98,…