当前位置:文档之家› 软件设计与体系结构课程实验报告书

软件设计与体系结构课程实验报告书

实验一、教务系统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.javaimport 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();elseissueWarning();}}}public static void main(String[] args) {ClientUI connection = new ClientUI();}}SingleLogonGUI.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;public class SingleLogonGUI extends JFrame { public static final String LOGON = "Log On";public static final String EXIT = "Exit";private String USERNM="mikesun";private String PASSWD = "opensesame";private JTextField txtUser;private JTextField txtPassWord;private static SingleLogonGUI instance = null;private JTextField txtInstruction;private SingleLogonGUI() {super("SingleLogonGUI - Singleton");initializeGUI();}public static SingleLogonGUI getInstance() { if (instance == null)instance = new SingleLogonGUI();return instance;}public void initializeGUI() {JLabel lblUsrName = new JLabel("User Name");JLabel lblPassWord = new JLabel("Password");txtUser = new JTextField(USERNM);txtPassWord = new JTextField(PASSWD);JButton btnLogon = new JButton(LOGON);btnLogon.setMnemonic(KeyEvent.VK_S);JButton btnExit = new JButton(EXIT);btnExit.setMnemonic(KeyEvent.VK_X);ButtonHandler vf = new ButtonHandler();btnLogon.addActionListener(vf);btnExit.addActionListener(vf);JPanel buttonPanel = new JPanel();GridBagLayout gridbag = new GridBagLayout();buttonPanel.setLayout(gridbag);GridBagConstraints gbc = new GridBagConstraints();buttonPanel.add(lblUsrName);buttonPanel.add(txtUser);buttonPanel.add(lblPassWord);buttonPanel.add(txtPassWord);buttonPanel.add(btnLogon);buttonPanel.add(btnExit);gbc.insets.top = 5;gbc.insets.bottom = 5;gbc.insets.left = 5;gbc.insets.right = 5;gbc.gridx = 0;gbc.gridy = 0;gridbag.setConstraints(lblUsrName, gbc);gbc.anchor = GridBagConstraints.WEST;gbc.gridx = 1;gbc.gridy = 0;gridbag.setConstraints(txtUser, gbc);gbc.gridx = 0;gbc.gridy = 1;gridbag.setConstraints(lblPassWord, gbc);gbc.anchor = GridBagConstraints.WEST;gbc.gridx = 1;gbc.gridy = 1;gridbag.setConstraints(txtPassWord, gbc);gbc.anchor = GridBagConstraints.EAST;gbc.insets.left = 2;gbc.insets.right = 2;gbc.insets.top = 40;gbc.gridx = 0;gbc.gridy = 6;gridbag.setConstraints(btnLogon, gbc);gbc.anchor = GridBagConstraints.WEST;gbc.gridx = 1;gbc.gridy = 6;gridbag.setConstraints(btnExit, gbc);Container contentPane = getContentPane();contentPane.add(buttonPanel, BorderLayout.CENTER);txtInstruction = new JTextField();txtInstruction.setBackground(Color.pink);contentPane.add( txtInstruction, BorderLayout.NORTH);setSize(320, 200);setVisible(true);}public boolean isValideCustomer() {String usr = txtUser.getText();String pwd = txtPassWord.getText();if(usr.equals(USERNM) && pwd.equals(PASSWD))return true;elsereturn false;}private void issueWarning(){txtInstruction.setText("Invalide user name or password.");}private void issueSuccess(){txtInstruction.setText("You have been successfully connected to the web."); }class ButtonHandler implements ActionListener {public void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals(EXIT)) {System.exit(1);}if (e.getActionCommand().equals(LOGON)) {boolean isValideCus = isValideCustomer();if(isValideCus == false){ //logon failedissueWarning();}else{ //logon successfullyissueSuccess();}}}}}// end of class。

相关主题