软件设计与体系结构课程实验报告书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一、教务系统
1. 实验目的:
①学习工厂模式;
②掌握简单工厂模式的用法,以及其优缺点;
③掌握抽象工厂模式的用法,以及其优缺点。
2. 实验内容:
1.假设我们开发一个教务管理系统,现在教务处已经购买了Oracle数据库的2年使用权,且数据库
中有大量数据,不能短时间内进行数据库迁移。教务处提出一个要求,希望我们的系统现在可以支持Oracle,但在他们需要的时候,增加支持MySql、SQLServer的功能,请用简单工厂模式实现这一需求。(提示:具体代码可以数据读取写入工作抽象为一行命令行输出,但是核心的类关系必须给出。)
2.请用抽象工厂模式实现出以上需求。
3. 简单工厂
优点:
1、工厂方法包含从一个类的结构中选择初始类的业务逻辑。
2、客户类不直接创建产品类的对象。客户类只作为对象的消费者。
3、简单工厂方法模式实现了责任分离。
4、客户类不负有创建类的对象的责任,因此如果有新产品子类加入,不必修改已有的客户类代码。
缺点:
1、简单工厂方法模式不符合开闭原则。
2、简单工厂类只能是一个单独的类,而不能成为一个层次的类
4. 抽象工厂
优点:
1、具体产品从客户代码中被分离出来
2、容易改变产品的系列
3、将一个系列的产品族统一到一起创建
缺点:
在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口
5. 类图
6、实验总结
对于简单工厂和抽象工厂的学习有了初步的认识,在此学习中基本了解了什么情况下使用简单工厂和抽象工厂。
简单工厂:
1、工厂类负责创建的对象比较少;
2、客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
3、由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
抽象工厂:
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2、这个系统有多于一个的产品族,而系统只消费其中某一产品族。
3、同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
实验二、网络连接
1. 实验目的:
①学习单例模式;
②掌握单例模式的用法,以及其优缺点;
2. 实验内容:
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
根据下面的UML图,完成相关的代码,要求为:
1,成功运行所给代码;
2,运用线程安全的单例模式重新设计软件框架;
3,用代码完成你的设计。
3.单例模式
单例模式:单例模式作为对象的一种创建模式,它的作用是确保某一个类在整个系统中只有一个实例,而且自行实例化并向整个系统提供这个实例。
其特点:
1、单例类只能有一个实例
2、单例类必须自己创建自己唯一的实例
3、单例类必须给所有其他对象提供这一实例
优点:
1、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
2、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点:
1、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
2、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
3、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中,只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中,其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
4.运行图示:
5.相关代码:
ClientUI.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ClientUI extends JFrame{
private static final String CONNECT = "Create Connection";
private static final String EXIT = "Exit";
private JTextField txtInstruction;
private SingleLogonGUI objLogon = null;
public ClientUI() {
super("ClientUI - Singleton Pattern");
JButton btnConnect = new JButton(CONNECT);
JButton btnExit = new JButton(EXIT);
btnConnect.setMnemonic(KeyEvent.VK_S);
btnExit.setMnemonic(KeyEvent.VK_X);
ButtonHandler vf = new ButtonHandler();
btnConnect.addActionListener(vf);
btnExit.addActionListener(vf);
JPanel buttonPanel = new JPanel();
buttonPanel.setBackground(Color.green);
buttonPanel.add(btnConnect);
buttonPanel.add(btnExit);
txtInstruction = new JTextField("Click to get a connection");
txtInstruction.setBackground(Color.green);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(buttonPanel, "South");
contentPane.add(txtInstruction, "Center");
setSize(320, 120);
setVisible(true);
}
private void issueWarning(){
txtInstruction.setT ext("Error. You cannot start a second connection."); }
class ButtonHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals(EXIT)) {
System.exit(1);
}
else if (e.getActionCommand().equals(CONNECT)) {
if(objLogon == null)
objLogon = SingleLogonGUI.getInstance();