抽象工厂模式设计实验

server/2024/9/25 21:28:10/

【实验内容】

楚锋软件公司欲开发一套界面皮肤库,可以对 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://www.ppmy.cn/server/14118.html

相关文章

QT Sqlite 内存模式 简单读写

//本文描述了QT Sqlite 内存模式 &#xff0c;使用QT 自带库文件&#xff0c;写入和读取。 //QT 6.2.4 MSVC2019调试通过。 //需要在pro文件中加入QT sql #include <QCoreApplication> #include <QSqlDatabase> #include <QSqlQuery> #include <QDebu…

简述PDF原理和实践

Hello&#xff0c;我是小恒不会java。 由于最近有输出PDF报表的项目需求&#xff0c;所以复习一下PDF到底是什么&#xff0c;该如何产生&#xff0c;如何应用至项目中。 更多参见Adobe官方文档&#xff08;https://www.adobe.com/cn/&#xff09; PDF原理 PDF&#xff08;Port…

python制作ppt

在Python中&#xff0c;你可以使用python-pptx库来创建和修改PowerPoint (.pptx) 文件。这个库允许你添加幻灯片、文本框、图片、形状、表格等元素&#xff0c;并可以调整它们的格式和布局。 下面是一个简单的例子&#xff0c;展示了如何使用python-pptx库来创建一个PPT文件&a…

使用 Rust 后,我​​使用 Python 的方式发生了变化

使用 Rust 后&#xff0c;我​​使用 Python 的方式发生了变化 Using type hints where possible, and sticking to the classic “make illegal state unrepresentable” principle. 尽可能使用类型提示&#xff0c;并坚持经典的“使非法状态不可表示”原则。 近年来&#xff…

Java面试八股之经验总结

我们先来聊聊面试的技巧吧&#xff0c;只是单纯的个人经验总结&#xff0c;如果大家觉得有道理&#xff0c;就选择性吸收一下就好了。如果觉得没用&#xff0c;可以直接跳过。 自我介绍一定要好好准备。我之前对自我介绍这部分也不是很重视&#xff0c;面试多了之后我发现&…

深度学习推理框架汇总

深度学习推理框架汇总 TensorFlow Serving&#xff1a;TensorFlow Serving 是 TensorFlow 的官方模型服务框架&#xff0c;专门用于部署 TensorFlow 模型。它提供了高性能、可扩展、灵活的模型部署和推理服务。 TorchServe&#xff1a;TorchServe 是 PyTorch 官方推出的模型服…

2024-4-23 群讨论:Java堆空间OutOfMemoryError该怎么办

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信进群拉你 1. 为什么不建议打开 HeapDumpOnOutOfMemoryError&#xff1f; 1.1. 打开 HeapDumpOnOutOfMemoryError&#xff0c;哪些 OutOfMemoryError 会触发 HeapDumpOnOutOfMemory…

数据库服务的运行与登录

打开数据库服务 数据库服务: SQL Server(MSSQLServer) 运行在服务器端的应用程序, 提供数据的存储 / 处理和事务等在使用DBMS的客户端之前必须首先打开该服务 客户端连接到服务器 关于客户端 / 服务器端的说明 客户端 : 数据库管理系统(DBMS), 应用程序服务器端 : 安装的数据…