版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
教務(wù)系統(tǒng)實驗?zāi)康模簩W(xué)習(xí)工廠模式;掌握簡單工廠模式的用法,以及其優(yōu)缺點;掌握抽象工廠模式的用法,以及其優(yōu)缺點。實驗內(nèi)容:假設(shè)我們開發(fā)一個教務(wù)管理系統(tǒng),現(xiàn)在教務(wù)處已經(jīng)購買了Oracle數(shù)據(jù)庫的2年使用權(quán),且數(shù)據(jù)庫中有大量數(shù)據(jù),不能短時間內(nèi)進(jìn)行數(shù)據(jù)庫遷移。教務(wù)處提出一個要求,希望我們的系統(tǒng)現(xiàn)在可以支持Oracle,但在他們需要的時候,增加支持MySql、SQLServer的功能,請用簡單工廠模式實現(xiàn)這一需求。(提示:具體代碼可以數(shù)據(jù)讀取寫入工作抽象為一行命令行輸出,但是核心的類關(guān)系必須給出。)請用抽象工廠模式實現(xiàn)出以上需求。簡單工廠優(yōu)點:工廠方法包含從一個類的結(jié)構(gòu)中選擇初始類的業(yè)務(wù)邏輯??蛻纛惒恢苯觿?chuàng)建產(chǎn)品類的對象??蛻纛愔蛔鳛閷ο蟮南M者。簡單工廠方法模式實現(xiàn)了責(zé)任分離??蛻纛惒回?fù)有創(chuàng)建類的對象的責(zé)任,因此如果有新產(chǎn)品子類加入,不必修改已有的客戶類代碼。缺點:簡單工廠方法模式不符合開閉原則。簡單工廠類只能是一個單獨的類,而不能成為一個層次的類抽象工廠優(yōu)點:1、具體產(chǎn)品從客戶代碼中被分離出來2、容易改變產(chǎn)品的系列3、將一個系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建缺點:在產(chǎn)品族中擴(kuò)展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口類圖實驗總結(jié)對于簡單工廠和抽象工廠的學(xué)習(xí)有了初步的認(rèn)識,在此學(xué)習(xí)中基本了解了什么情況下使用簡單工廠和抽象工廠。簡單工廠:1、工廠類負(fù)責(zé)創(chuàng)建的對象比較少;2、客戶只知道傳入工廠類的參數(shù),對于如何創(chuàng)建對象(邏輯)不關(guān)心;3、由于簡單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡單的情況下應(yīng)用。抽象工廠:1、一個系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對于所有形態(tài)的工廠模式都是重要的。2、這個系統(tǒng)有多于一個的產(chǎn)品族,而系統(tǒng)只消費其中某一產(chǎn)品族。3、同屬于同一個產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設(shè)計中體現(xiàn)出來。4、系統(tǒng)提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實現(xiàn)。網(wǎng)絡(luò)連接實驗?zāi)康模簩W(xué)習(xí)單例模式;掌握單例模式的用法,以及其優(yōu)缺點;實驗內(nèi)容:單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案。根據(jù)下面的UML圖,完成相關(guān)的代碼,要求為:成功運行所給代碼;運用線程安全的單例模式重新設(shè)計軟件框架;用代碼完成你的設(shè)計。JFrameJFrameClientGUI-objLogon:LogonGUI-issueWarning()+actionPerformed(ActionEvente)JFrameSingleLogonGUI-instance:SingleLogonGUI;+getInstance():SingleLogonGUI-isValideCustomer:boolean-issueWarning()-issueSuccess()+actionPerformed(ActionEvente)3.單例模式單例模式:單例模式作為對象的一種創(chuàng)建模式,它的作用是確保某一個類在整個系統(tǒng)中只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。其特點:1、單例類只能有一個實例2、單例類必須自己創(chuàng)建自己唯一的實例3、單例類必須給所有其他對象提供這一實例優(yōu)點:1、實例控制單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。2、靈活性因為類控制了實例化過程,所以類可以靈活更改實例化過程。缺點:1、開銷雖然數(shù)量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷??梢酝ㄟ^使用靜態(tài)初始化解決此問題。2、可能的開發(fā)混淆使用單例對象(尤其在類庫中定義的對象)時,開發(fā)人員必須記住自己不能使用new關(guān)鍵字實例化對象。因為可能無法訪問庫源代碼,因此應(yīng)用程序開發(fā)人員可能會意外發(fā)現(xiàn)自己無法直接實例化此類。3、對象生存期不能解決刪除單個對象的問題。在提供內(nèi)存管理的語言中,只有單例類能夠?qū)е聦嵗蝗∠峙洌驗樗瑢υ搶嵗乃接幸?。在某些語言中,其他類可以刪除對象實例,但這樣會導(dǎo)致單例類中出現(xiàn)懸浮引用。運行圖示:5.相關(guān)代碼:ClientUI.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassClientUIextendsJFrame{privatestaticfinalStringCONNECT="CreateConnection";privatestaticfinalStringEXIT="Exit";privateJTextFieldtxtInstruction;privateSingleLogonGUIobjLogon=null;publicClientUI(){super("ClientUI-SingletonPattern");JButtonbtnConnect=newJButton(CONNECT);JButtonbtnExit=newJButton(EXIT);btnConnect.setMnemonic(KeyEvent.VK_S);btnExit.setMnemonic(KeyEvent.VK_X);ButtonHandlervf=newButtonHandler();btnConnect.addActionListener(vf);btnExit.addActionListener(vf);JPanelbuttonPanel=newJPanel();buttonPanel.setBackground(Color.green);buttonPanel.add(btnConnect);buttonPanel.add(btnExit);txtInstruction=newJTextField("Clicktogetaconnection");txtInstruction.setBackground(Color.green);ContainercontentPane=getContentPane();contentPane.setLayout(newBorderLayout());contentPane.add(buttonPanel,"South");contentPane.add(txtInstruction,"Center");setSize(320,120);setVisible(true);}privatevoidissueWarning(){txtInstruction.setText("Error.Youcannotstartasecondconnection."); }classButtonHandlerimplementsActionListener{publicvoidactionPerformed(ActionEvente){if(e.getActionCommand().equals(EXIT)){System.exit(1);}elseif(e.getActionCommand().equals(CONNECT)){ if(objLogon==null) objLogon=SingleLogonGUI.getInstance(); else issueWarning();}}}publicstaticvoidmain(String[]args){ ClientUIconnection=newClientUI();}}SingleLogonGUI.javaimportjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassSingleLogonGUIextendsJFrame{publicstaticfinalStringLOGON="LogOn";publicstaticfinalStringEXIT="Exit";privateStringUSERNM="mikesun";privateStringPASSWD="opensesame";privateJTextFieldtxtUser;privateJTextFieldtxtPassWord;privatestaticSingleLogonGUIinstance=null;privateJTextFieldtxtInstruction;privateSingleLogonGUI(){ super("SingleLogonGUI-Singleton"); initializeGUI();}publicstaticSingleLogonGUIgetInstance(){ if(instance==null) instance=newSingleLogonGUI(); returninstance;}publicvoidinitializeGUI(){JLabellblUsrName=newJLabel("UserName");JLabellblPassWord=newJLabel("Password");txtUser=newJTextField(USERNM);txtPassWord=newJTextField(PASSWD);JButtonbtnLogon=newJButton(LOGON);btnLogon.setMnemonic(KeyEvent.VK_S);JButtonbtnExit=newJButton(EXIT);btnExit.setMnemonic(KeyEvent.VK_X);ButtonHandlervf=newButtonHandler();btnLogon.addActionListener(vf);btnExit.addActionListener(vf);JPanelbuttonPanel=newJPanel();GridBagLayoutgridbag=newGridBagLayout();buttonPanel.setLayout(gridbag);GridBagConstraintsgbc=newGridBagConstraints();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);ContainercontentPane=getContentPane();contentPane.add(buttonPanel,BorderLayout.CENTER);txtInstruction=newJTextField();txtInstruction.setBackground(Color.pink);contentPane.add(txtInstruction,BorderLayout.NORTH);setSize(320,200);setVisible(true);}publicbooleanisValideCustomer(){ Stringusr=txtUser.getText(); Stringpwd=txtPassWord.getText(); if(usr.equals(USERNM)&&pwd.equals(PASSWD))returntrue;els
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 海南職業(yè)技術(shù)學(xué)院《電視攝像基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度擔(dān)保合同標(biāo)的特性與信用管理3篇
- 二零二五年度新媒體運營兼職聘任合同范本3篇
- 海南師范大學(xué)《游泳訓(xùn)練理論與實踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度小額貸款反擔(dān)保償還服務(wù)合同模板3篇
- 2025年度架工承包合同服務(wù)內(nèi)容擴(kuò)展2篇
- 二零二五年度建筑工程施工現(xiàn)場環(huán)境保護(hù)教育培訓(xùn)合同3篇
- 二零二五年度橋梁欄桿維修與加固服務(wù)合同3篇
- 二零二五年度舊電器買賣與環(huán)保回收處理合同3篇
- 二零二五年度假山景區(qū)生態(tài)保護(hù)與可持續(xù)發(fā)展承包合同3篇
- 品牌管理第五章品牌體驗課件
- 基于CAN通訊的儲能變流器并機(jī)方案及應(yīng)用分析報告-培訓(xùn)課件
- 外科醫(yī)師手術(shù)技能評分標(biāo)準(zhǔn)
- 保姆級別CDH安裝運維手冊
- 菌草技術(shù)及產(chǎn)業(yè)化應(yīng)用課件
- GB∕T 14527-2021 復(fù)合阻尼隔振器和復(fù)合阻尼器
- 隧道二襯、仰拱施工方案
- 顫?。ㄅ两鹕。┲嗅t(yī)護(hù)理常規(guī)
- 果膠項目商業(yè)計劃書(模板范本)
- 旋挖鉆成孔掏渣筒沉渣處理施工工藝
- 安全資料目錄清單
評論
0/150
提交評論