抽象工厂模式设计实验

【实验内容】

楚锋软件公司欲开发一套界面皮肤库,可以对 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.java
 public class SummerButton implements Button{
    public void display(){
        System.out.println("显示浅蓝色按钮");
    }    
}

ComboBox.java
public interface ComboBox {
    public void display();
}

SpringComboBox.java
 public class SpringComboBox implements ComboBox{
    public void display(){
        System.out.println("显示绿色边框组合框");
    }    
}

SummerComboBox.java
 public class SummerComboBox implements ComboBox{
    public void display(){
        System.out.println("显示蓝色边框组合框");
    }    
}

TextField.java
 public interface TextField {
    public void display();    
}

SpringTextField.java
 public class SpringTextField implements TextField{
    public void display(){
        System.out.println("显示绿色边框文本框");
    }    
}

SummerTextField.java
 public class SummerTextField implements TextField{
    public void display(){
        System.out.println("显示蓝色边框文本框");
    }    
}

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

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

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

【实验要求】

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

【实验答案参考】

UML设计类图:

Java代码:

SkinFactory.java
 public interface SkinFactory {
    public Button createButton();
    public TextField createTextField();
    public ComboBox createComboBox();
}

SpringSkinFactory.java
 public class SpringSkinFactory implements SkinFactory{
    public Button createButton(){
        return new SpringButton();
    }
    public TextField createTextField(){
        return new SpringTextField();
    }
    public ComboBox createComboBox(){
        return new SpringComboBox();
    }
}


SummerSkinFactory.java
 public 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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

骨传导耳机哪个牌子好?5款年度精品骨传导耳机推荐

在骨传导耳机最开始出现的时候,相信很多人都只关心骨传导耳机的外观颜值和特殊的传声方式,但当你真正用过一段时间后,对骨传导耳机有了更加深入的了解后就会关注到骨传导耳机的使用体验、音质表现、蓝牙性能等具体功能,而随着骨传…

【Flutter】多语言方案二:GetX 版

介绍 多语言方案:GetX版,需要手动自定义字符串引用常量,优点不需要自己管理状态。 目录 介绍运行效果一、安装 GetX二、使用1.语言配置 在lib/core下创建一个language文件夹,文件夹下创建一个local.dart文件2.language文件夹下创…

防反接、防过压、缓启动电路相关

一、防反接电路 电源正确接入时 电流从 VIN 端流向负载,经由 Q3(NMOS) 通向地(GND)。在上电瞬间,由于 MOS 管的体二极管效应,地回路通过体二极管接通。接下来,由于 Vgs(门源电压)大于 Vgsth(门限电压)&…

负载均衡器

服务端负载均衡器 在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如F5),也有软件的(比如Nginx,openResty) 如Nginx ,通过Nginx进行负载均衡,先发送请求…

AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架 附代码实现

AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架 摘要(Abstract):高频交易(HFT)使用计算机算法在短时间内(例如秒级)做出交易决策,在加密货币市场(例如比特币)中…

ctfshow web入门 SQl注入 web185--web190

web185 这道题还有另外一个脚本就是用concat的拼接达到有数字的目的 concat(truetrue) 2 concat(true) 1 concat(true, true) 11 然后上脚本(Y4tacker这个师傅的) # Author:Y4tacker import requestsurl "http://341e93e1-a1e7-446a-b7fc-75beb…

Pytest精通指南(27)钩子函数-多重校验(pytest-assume)

文章目录 前言应用场景插件安装注意事项参数分析assert断言示例assume断言示例 前言 pytest-assume是pytest的一个扩展插件,它提供了一种新的断言方式,即**“assume”**。 与常规的assert语句不同,当使用assume进行断言时,即使某个…

【Android12】Bugreport实现原理

Bugreport实现原理 Bugreport Bugreport介绍 Android Bugreport是一个用于记录和收集 Android设备上系统信息、日志和调试信息的工具。 系统发生某些问题时,可以通过bugreport把系统当前时刻点(运行BugRepot的时刻)的系统相关的状态和信息…

深度解析:云计算的三宝——IaaS、PaaS和SaaS

4月22日,腾讯宣布旗下协作SaaS产品全面接入腾讯混元大模型,除去企业微信、腾讯会议、腾讯文档等“一门三杰”产品,腾讯乐享、腾讯电子签、腾讯问卷、腾讯云AI代码助手等协作SaaS产品也都已实现智能化升级。大模型应用落地再加速。 那么什么是…

fawawf

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

区块链钱包开发——专业区块链开发

随着区块链技术的发展,钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性,分析当前面临的挑战,并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

05_FreeRTOS信号量

信号量 信号量信号量简介常用信号量API函数 信号量 信号量简介 信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中&#xf…

【C语言__指针02__复习篇12】

目录 前言 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 前言 本篇主要讨论以下问题: 1. 数组名通常表示什么,有哪两种例外情况,在例外情况中…

Electron+Vue3+ElectronForge整合 - 打包时整合 -分步打包

说明 本文介绍一下 Electron Vue3 的打包整合的基本操作。实现的效果是 : 1、一个正常的Vue3项目; 2、整合加入 Electron 框架 :开发时 Electron 加载的是开发的vue项目; 3、完成打包时整合:3.1 先完成vue3项目的正常…

加州理工华人用AI颠覆数学证明!提速5倍震惊陶哲轩,80%数学步骤全自动化

加州理工团队解决了形式化研究神器Lean运行LLM推理时的核心技术挑战,可以让LLM在Lean中提出证明策略,允许人类以无缝的方式干预和修改。 Lean Copilot,让陶哲轩等众多数学家赞不绝口的这个形式化数学工具,又有超强进化了&#xf…

pytest教程-29-重复执行用例插件-pytest-repeat

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了设置用例超时时间插件pytest-timeout,本小节我们讲解一下pytest重复执行用例插件pytest-repeat。 前言 做功能测试的时候,经常会遇到某个模块不稳定,偶然会…

五款最受欢迎的上网行为管理软件

五款最受欢迎的上网行为管理软件 员工上网看视频怎么办?员工偷偷刷抖音怎么办?员工天天上招聘网,是不是有离职打算? 解决上述困扰的最好办法是使用监控软件了解员工一言一行。以下是几款推荐的上网行为管理和监控软件:…

【Linux】开关机命令和服务管理类命令

一般Linux是不会经常进行关机的,关机的正确流程是: sync->shutdown->reboot->poweroff sync: 将内存中的数据同步到硬盘中poweroff: 关闭系统,等同于shutdown -h nowreboot: 重启系统,等同于 shutdown -r nowshutdown[选项] [时间] shutdown命令常见用法: shutdown:…

二叉树的先序、中序和后序遍历,以及二叉树的高度

1、二叉树的三种遍历方式 前序遍历: 访问根节点前序遍历左子树前序遍历右子树示例:对于节点 A(左子树为 B,右子树为 C),遍历顺序为 A -> B -> C。 中序遍历: 中序遍历左子树访问根节点中…

如何在Windows服务做性能测试(CPU、磁盘、内存)

目录 前言1. 基本知识2. 参数说明 前言 由于需要做一些接口测试,测试是否有真的优化 1. 基本知识 该基本知识主要用来用到Performance Monitor,以下着重介绍下这方面的知识 性能监视器(Performance Monitor):Windo…