抽象工厂模式设计实验

【实验内容】

楚锋软件公司欲开发一套界面皮肤库,可以对 Java 桌面软件进行界面美化。为了保护版权,该皮肤库源代码不打算公开,而只向用户提供已打包为 jar 文件的 class 字节码文件。用户在使用时可以通过菜单来选择皮肤,不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素。其结构示意图如下图所示。

该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。

楚锋软件公司的开发人员针对上述要求,决定使用工厂方法模式进行系统的设计。为了保证系统的灵活性和可扩展性,提供一系列具体工厂来创建按钮、文本框、组合框等界面元素,客户端针对抽象工厂编程,初始结构如下图所示。

上图中的产品抽象类和具体产品类代码如下:

Button.java
public interface Button {public void display();    
}SpringButton.java
public class SpringButton implements Button{public void display(){System.out.println("显示浅绿色按钮");}    
}SummerButton.javapublic class SummerButton implements Button{public void display(){System.out.println("显示浅蓝色按钮");}    
}ComboBox.java
public interface ComboBox {public void display();
}SpringComboBox.javapublic class SpringComboBox implements ComboBox{public void display(){System.out.println("显示绿色边框组合框");}    
}SummerComboBox.javapublic class SummerComboBox implements ComboBox{public void display(){System.out.println("显示蓝色边框组合框");}    
}TextField.javapublic interface TextField {public void display();    
}SpringTextField.javapublic class SpringTextField implements TextField{public void display(){System.out.println("显示绿色边框文本框");}    
}SummerTextField.javapublic class SummerTextField implements TextField{public void display(){System.out.println("显示蓝色边框文本框");}    
}

在上述的设计中,提供了大量工厂来创建具体的界面组件,可以通过配置文件更换具体界面组件从而改变界面风格。但是,此设计方案存在以下问题:

(1)当需要增加新的皮肤时,虽然不需要修改现有代码,但是需要增加大量类,针对每一个新增具体组件都需要增加一个具体工厂,类的个数成对增加,这无疑会导致系统越来越庞大,从而增加了系统的维护成本和运行开销。

(2)由于同一种风格的具体界面组件通常要一起显示,因此需要为每个组件都选择一个具体工厂,用户在使用时必须逐个进行设置,如果某个具体工厂选择失误将会导致界面显示混乱,虽然可以适当增加一些约束语句,但客户端代码和配置文件都较为复杂。如何减少系统中类的个数并保证客户端每次始终只使用某一种风格的具体界面组件?这是楚锋软件公司开发人员所面临的两个问题。显然,工厂方法模式无法解决这两个问题。

【实验要求】

使用抽象工厂模式重构上面的设计。给出设计类图,以及对应的 Java 代码。

【实验答案参考】

UML设计类图:

Java代码:

SkinFactory.javapublic interface SkinFactory {public Button createButton();public TextField createTextField();public ComboBox createComboBox();
}SpringSkinFactory.javapublic class SpringSkinFactory implements SkinFactory{public Button createButton(){return new SpringButton();}public TextField createTextField(){return new SpringTextField();}public ComboBox createComboBox(){return new SpringComboBox();}
}SummerSkinFactory.javapublic class SummerSkinFactory implements SkinFactory{public Button createButton(){return new SummerButton();}public TextField createTextField(){return new SummerTextField();}public ComboBox createComboBox(){return new SummerComboBox();}
}Client.java
public class Client {public static void main(String[] args) {SkinFactory factory;Button button;TextField textfield;ComboBox combobox;factory=new SpringSkinFactory();button=factory.createButton();textfield=factory.createTextField();combobox=factory.createComboBox();button.display();textfield.display();combobox.display();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】C++的四种类型转换

一、C语言中的类型转换 在C语言中有两种类型转换,隐式类型转换和显示类型转换。 如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。 隐式类型转换&#…

Unity系统学习笔记

文章目录 1.基础组件的认识1.0.组件继承关系图1.1.项目工程文件结构,各个文件夹都是做什么的?1.2.物体变化组件1.2.3.三维向量表示方向1.2.4.移动物体位置附录:使用变换组件实现物体WASD移动 1.3.游戏物体和组件的显示和禁用1.3.1.界面上的操…

C语言入门课程学习笔记2

C语言入门课程学习笔记2 第8课 - 四则运算与关系运算第9课 - 逻辑运算与位运算第10课 - 深度剖析位运算第11课 - 程序中的选择结构 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程,图片全部来源于课程PPT,仅用于个人学习记录 第8课 - 四则运算与关系…

共享汽车管理|基于SprinBoot+vue的共享汽车管理系统(源码+数据库+文档)

共享汽车管理目录 基于SprinBootvue的共享汽车管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员模块的实现 1.1 用户信息管理 1.2 投放地区管理 1.3 汽车信息管理 1.4 汽车入库管理 2 用户模块的实现 2.1 汽车投放 2.2 使用订单管理 2.3 汽车归还 四、…

为AI电脑生态注入强悍动力,安耐美PlatiGemini 1200W高性能电源

在DIY攒机的过程中,电源是非常重要的一环,现在高性能的硬件功耗往往很高,因此一款优秀的电源整个系统稳定运行的基石。最近,我发现一款由安耐美(Enermax)推出的PlatiGemini 1200W电源,它不仅满足…

刷代码随想录有感(45):二叉树的最大深度

题干: 力扣这里给了定义:二叉树的最大深度指的是从根节点开始,到最远叶子所经过的节点数。 代码: class Solution {//递归实现 public:int maxDepth(TreeNode* root) {if(root NULL)return NULL;int leftheight maxDepth(root…

离散数学之命题逻辑思维导图+大纲笔记(预习、期末复习,考研,)

大纲笔记: 命题逻辑的基本概念 命题与联结词 命题 命题是推理的基本单位 真命题,假命题 特征 陈述句 唯一的真值 是非真即假的陈述句 非命题 疑问句 祈使句 可真可假 悖论 模糊性 三个基本概念 复合命题 真值取决于原子命题的值和逻辑联结词 原子命题 逻…

【leetcode面试经典150题】71. 对称二叉树(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

Mybatis框架怎么查看执行的sql语句

文章目录 一、打开idea搜索mybatis SimpleExecutor类二、找到类中doQuery方法,并打断点二、发请求后,查看boundSql 一、打开idea搜索mybatis SimpleExecutor类 org.apache.ibatis.executor.SimpleExecutor二、找到类中doQuery方法,并打断点 …

外贸订单从初始到成交,都涉及哪些环节?

前言 经常听到这个言论:做外贸不就是找到国外客户,用英文把产品推荐给他们,然后收款。就这么easy,能有多复杂? 没那么简单,外贸是和内销有相通之处,但是过程却完全不同。涉及到的环节还是挺复杂…

为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?)

目录 1.分表 2.分库 说白了,分库分表是两回事儿,大家可别搞混了,可能是光分库不分表,也可能是光分表不分库,都有可能。 我先给大家抛出来一个场景。 假如我们现在是一个小创业公司(或者是一个 BAT …

Spark02

Spark02 一. PyCharm创建PySpark项目1. 创建项目,配置环境2. 连接到远服务器3. 程序入口 一. PyCharm创建PySpark项目 1. 创建项目,配置环境 2. 连接到远服务器 3. 程序入口

【THM】Windows Privilege Escalation(Windows权限提升)-初级渗透测试

介绍 在渗透测试期间,您通常可以使用非特权用户访问某些 Windows 主机。非特权用户将拥有有限的访问权限,仅包括其文件和文件夹,并且无法在主机上执行管理任务,从而阻止您完全控制目标。 本房间涵盖攻击者可用来在 Windows 环境中提升权限的基本技术,允许您在可能的情况…

什么是分解交易?fpmarkets一分钟讲清楚

分解交易是什么?用这种交易方式能赚到钱吗?这种策略有什么好处?有什么弊端呢?今天fpmarkets澳福一分钟给各位投资者讲清楚。 其实在fpmarkets看来分解交易就是一种很简单的外汇策略,主要信号是趋势线的分解。看涨趋势线…

this指向

调用方式示例 函数中this的指向通过new调用new method()新对象直接调用method()全局对象通过对象调用obj.method()前面的对象call、apply、bindmethod.call(ctx)第一个参数 我们说的this指向是一个函数里边的this指向,如果这个this不在函数里边,那th…

ShardingSphere-JDBC快速入门

ShardingSphere-JDBC读写分离快速入门 一、ShardingSphere-JDBC 读写分离1.创建springboot程序1.1 添加依赖1.2 java代码1.3 配置 2.测试 二、ShardingSphere-JDBC垂直分片1.创建springboot程序1.1 导入依赖1.2 java代码1.3 配置 2.测试 三、ShardingSphere-JDBC水平分片1.创建…

WPForms Pro插件下载:简化您的在线表单构建,提升用户互动

在当今的数字化世界中,表单是网站与用户互动的关键。无论是收集信息、处理订单还是进行调查,一个好的表单可以极大地提升用户体验和转化率。WPForms Pro插件,作为一款专业的WordPress表单构建工具,旨在帮助您轻松创建美观、功能强…

MySQL无法打开情况下读取frm文件的表结构

一、背景: 开发人员通过MySQL客户端工具,可以访问MySQL5.7.6,可以访问具体的DB,可以查看小写表的数据,但是无法查看大写表的数据,报错信息为“table does not exist”。 二、检查与分析: ssh登录…

mac如何通过Teminal查找本机ip地址

方法1 ifconfig ifconfig终端中使用 ifconfig 可以查看本地 ip 但是看到的信息太多了,我们只是想要一个本机ip而已 方法2 ifconfig en0 ifconfig en0相比方法1我们算是直接获取到了本机ip,但是第一眼看到还是需要反应一段时间 方法3 精准获取IP ifcon…

跑腿业务和支付业务的具体实现流程

校园云项目 跑腿业务的具体业务分析 该流程适用于很多接单相关的业务场景,或多或少都可以从中得到启发; 整个流程描述: 任务发布: 用户在平台上发布任务,描述需要完成的任务内容,包括取件地址、送达地址…