日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

机房收费系统之抽象工厂篇

發(fā)布時(shí)間:2025/6/15 windows 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机房收费系统之抽象工厂篇 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


??? 機(jī)房收費(fèi)系統(tǒng)vb.net個(gè)人版已完成,在此過程中分層的好處在系統(tǒng)的完成過程中得到了很好的體會(huì)。第一遍用的是純?nèi)龑幼龅?#xff0c;這幾天又在此基礎(chǔ)上又重構(gòu)了登錄的demo,加上抽象工廠和配置文件的使用。下面以登錄功能為例,總結(jié)一下我的機(jī)房收費(fèi)系統(tǒng)。

一、下面看一下我的包圖:

????? 可以看到,這張圖是從最基本的三層UI→BLL→DAL加入設(shè)計(jì)模式(抽象工廠)演化而來的,采用抽象工廠是考慮到日后更換數(shù)據(jù)庫的方便。

?

二、準(zhǔn)備工作

???????創(chuàng)建數(shù)據(jù)表(課參見實(shí)體類中的代碼)

???????創(chuàng)建相應(yīng)的類庫和窗體。

???????我用的是vb.net的WidowsApplication來添加界面;使用類庫作為其它層的包。

?

三、抽象各層的類

??????? 當(dāng)我們確定了系統(tǒng)的整體架構(gòu),就要從宏觀到微觀的實(shí)現(xiàn)。

3.1 Entity(實(shí)體層)

??????? 數(shù)據(jù)庫設(shè)計(jì)好了,我們要根據(jù)數(shù)據(jù)庫中的表抽象實(shí)體類,系統(tǒng)中,實(shí)體類和表基本上是一一對(duì)象的。一個(gè)表映射一個(gè)實(shí)體類,表的字段即為實(shí)體類的屬性。

??????? 實(shí)體層并不屬于三層的任何一層,它是獨(dú)立出來的一層,可以把它看做是自定義變量的組合,供其它三層使用。

[vb] view plaincopyprint?
  • Public?Class?UserInfoEntity??
  • ?
  • #Region?"定義UserInfo表中各個(gè)屬性變量"??
  • ????Private?_userName?As?String??
  • ????Private?_name?As?String??
  • ????Private?_password?As?String??
  • ????Private?_userlevel?As?String??
  • ????Private?_accountHolder?As?String??
  • ????Private?_regDate?As?String??
  • ????Private?_regTime?As?String??
  • #End?Region??
  • ?
  • #Region?"定義數(shù)據(jù)表中各個(gè)字段名常量"??
  • ????Private?Const?DBFLELD_USERNAME?=?"userName"??
  • ????Private?Const?DBFLELD_NAME?=?"name"??
  • ????Private?Const?DBFLELD_PASSWORD?=?"password"??
  • ????Private?Const?DBFLELD_USERLEVEL?=?"userLevel"??
  • ????Private?Const?DBFLELD_ACCOUNTHOLDER?=?"accountHolder"??
  • ????Private?Const?DBFLELD_REGDATE?=?"regDate"??
  • ????Private?Const?DBFLELD_TIME?=?"regTime"??
  • #End?Region??
  • ?
  • #Region?"定義數(shù)據(jù)表中各個(gè)字段參數(shù)變量"??
  • ????Public?Const?DBPARAM_USERNAME?=?"@userName"??
  • ????Public?Const?DBPARAM_NAME?=?"@name"??
  • ????Public?Const?DBPARAM_PASSWORD?=?"@password"??
  • ????Public?Const?DBPARAM_USERLEVEL?=?"@userLevel"??
  • ????Public?Const?DBPARAM_ACCOUNTHOLDER?=?"@accountHolder"??
  • ????Public?Const?DBPARAM_REGDATE?=?"@regDate"??
  • ????Public?Const?DBPARAM_TIME?=?"@regTime"??
  • #End?Region??
  • ??
  • ????'''?<summary>??
  • ????'''?獲取數(shù)據(jù)表中的一條記錄??
  • ????'''?</summary>??
  • ????'''?<param?name="dr">字段名</param>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Public?Sub?LoadFromDataRow(ByVal?dr?As?DataRow)??
  • ????????userName?=?dr(DBFLELD_USERNAME)??
  • ????????name?=?dr(DBFLELD_NAME)??
  • ????????password?=?dr(DBFLELD_PASSWORD)??
  • ????????userlevel?=?dr(DBFLELD_USERLEVEL)??
  • ????????accountHolder?=?dr(DBFLELD_ACCOUNTHOLDER)??
  • ????????regDate?=?dr(DBFLELD_REGDATE)??
  • ????????regTime?=?dr(DBFLELD_TIME)??
  • ????End?Sub??
  • ?
  • #Region?"填充一條記錄"??
  • ????'''?<summary>??
  • ????'''?填充一條記錄(登錄)到實(shí)體層??
  • ????'''?</summary>??
  • ????'''?<param?name="AuserName">用戶名</param>??
  • ????'''?<param?name="Apassword">密碼</param>??
  • ????'''?<param?name="AuserLevel">用戶級(jí)別</param>??
  • ????'''?<remarks>2013-5-9?by?liu?hai?yan?</remarks>??
  • ????Public?Overloads?Sub?Fill(ByVal?AuserName?As?String,?ByVal?Apassword?As?String,?ByVal?AuserLevel?As?String)??
  • ????????userName?=?AuserName??
  • ????????password?=?Apassword??
  • ????????userlevel?=?AuserLevel??
  • ????End?Sub??
  • #End?Region??
  • ?
  • #Region?"定義數(shù)據(jù)表中各個(gè)屬性"??
  • ????'''?<summary>??
  • ????'''?用戶名??
  • ????'''?</summary>??
  • ????'''?<value></value>??
  • ????'''?<returns></returns>??
  • ????'''?<remarks></remarks>??
  • ????Public?Property?userName()?As?String??
  • ????????Get??
  • ????????????Return?_userName??
  • ????????End?Get??
  • ????????Set(ByVal?value?As?String)??
  • ????????????_userName?=?value??
  • ????????End?Set??
  • ????End?Property??
  • ??
  • ????'''?<summary>??
  • ????'''?用戶姓名??
  • ????'''?</summary>??
  • ????'''?<value></value>??
  • ????'''?<returns></returns>??
  • ????'''?<remarks></remarks>??
  • ????Public?Property?name()?As?String??
  • ????????Get??
  • ????????????Return?_name??
  • ????????End?Get??
  • ????????Set(ByVal?value?As?String)??
  • ????????????_name?=?value??
  • ????????End?Set??
  • ????End?Property??
  • ??
  • ????'''?<summary>??
  • ????'''?用戶密碼??
  • ????'''?</summary>??
  • ????'''?<value></value>??
  • ????'''?<returns></returns>??
  • ????'''?<remarks></remarks>??
  • ????Public?Property?password()?As?String??
  • ????????Get??
  • ????????????Return?_password??
  • ????????End?Get??
  • ????????Set(ByVal?value?As?String)??
  • ????????????_password?=?value??
  • ????????End?Set??
  • ????End?Property??
  • ??
  • ????'''?<summary>??
  • ????'''?用戶權(quán)限??
  • ????'''?</summary>??
  • ????'''?<value></value>??
  • ????'''?<returns></returns>??
  • ????'''?<remarks></remarks>??
  • ????Public?Property?userlevel()?As?String??
  • ????????Get??
  • ????????????Return?_userlevel??
  • ????????End?Get??
  • ????????Set(ByVal?value?As?String)??
  • ????????????_userlevel?=?value??
  • ????????End?Set??
  • ????End?Property??
  • ??
  • ????'''?<summary>??
  • ????'''?開戶人??
  • ????'''?</summary>??
  • ????'''?<value></value>??
  • ????'''?<returns></returns>??
  • ????'''?<remarks></remarks>??
  • ????Public?Property?accountHolder()?As?String??
  • ????????Get??
  • ????????????Return?_accountHolder??
  • ????????End?Get??
  • ????????Set(ByVal?value?As?String)??
  • ????????????_accountHolder?=?value??
  • ????????End?Set??
  • ????End?Property??
  • ??
  • ????'''?<summary>??
  • ????'''?注冊(cè)日期??
  • ????'''?</summary>??
  • ????'''?<value></value>??
  • ????'''?<returns></returns>??
  • ????'''?<remarks></remarks>??
  • ????Public?Property?regDate()?As?String??
  • ????????Get??
  • ????????????Return?_regDate??
  • ????????End?Get??
  • ????????Set(ByVal?value?As?String)??
  • ????????????_regDate?=?value??
  • ????????End?Set??
  • ????End?Property??
  • ??
  • ????'''?<summary>??
  • ????'''?注冊(cè)時(shí)間??
  • ????'''?</summary>??
  • ????'''?<value></value>??
  • ????'''?<returns></returns>??
  • ????'''?<remarks></remarks>??
  • ????Public?Property?regTime()?As?String??
  • ????????Get??
  • ????????????Return?_regTime??
  • ????????End?Get??
  • ????????Set(ByVal?value?As?String)??
  • ????????????_regTime?=?value??
  • ????????End?Set??
  • ????End?Property??
  • #End?Region??
  • ??
  • End?Class??
  • ?

    ?????? 下面是配置文件的使用:在窗體層添加新項(xiàng)目→選中打開窗口的左邊的General選項(xiàng)→添加配置文件,(中間部分是需要手動(dòng)添加的)。

    [vb] view plaincopyprint?
  • <?xml?version="1.0"?encoding="utf-8"??>??
  • <configuration>??
  • ??
  • ????<appSettings?>??
  • ????????<add?key="connStr"?value?="Data?Source=.;Initial?Catalog=Login;User?ID=sa;Password=123456"/>??
  • ????????<add?key?="AssemblyName"?value?="DAL"/>??
  • ????????<add?key?="db"?value?="DB"/>??
  • ????</appSettings>??
  • ??
  • ????<startup>??
  • ????????<supportedRuntime?version="v4.0"?sku=".NETFramework,Version=v4.0,Profile=Client"?/>??
  • ????</startup>??
  • </configuration>??
  • ?

    3.2 DAL層(數(shù)據(jù)訪問層)

    ????接下來我們?cè)倏匆幌聰?shù)據(jù)訪問層(DAL),這一層的主要任務(wù)是直接操作數(shù)據(jù)庫,完成對(duì)數(shù)據(jù)的增刪改查等。這里我們?nèi)匀桓鶕?jù)數(shù)據(jù)表來抽象DAL層的類,基本上也是一個(gè)表對(duì)應(yīng)一個(gè)類,這樣當(dāng)我們?cè)黾有碌谋?#xff0c;直接增加新的DAL層類就可以,很好地符合了“開閉原則”。

    另外,因?yàn)?/span>DAL層的類是直接對(duì)數(shù)據(jù)庫進(jìn)行操作的類,所以這個(gè)類里封轉(zhuǎn)大都有四種方法:增刪改查。但根據(jù)實(shí)際情況會(huì)有不同的參數(shù),不同的返回值。

    ?????? 這里添加了接口層IDAL,利用反射和抽象工廠,以防更換數(shù)據(jù)庫。

    3.2.1 接口層IDAL,添加Entity的引用。

    [vb] view plaincopyprint?
  • Imports?Entity??
  • ??
  • Public?Interface?Iuser??
  • ????'''?<summary>??
  • ????'''?查看一條記錄是否存在??
  • ????'''?</summary>??
  • ????'''?<param?name="entityUser">用戶信息</param>??
  • ????'''?<returns>一條用戶記錄</returns>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Function?Check(ByVal?entityUser?As?UserInfoEntity)?As?UserInfoEntity??
  • End?Interface??
  • ?

    3.2.2 DAL層實(shí)現(xiàn)IDAL接口

    ??????? 下面是DAL層下的DataAccess類

    ??????? 添加Configuration引用時(shí)需從.net子項(xiàng)目中查找,還要添加項(xiàng)目引用Entity和IDAL.

    [vb] view plaincopyprint?
  • '如果沒有使用配置文件加反射,不用引用Configuration和Reflection??
  • Imports?System.Configuration??
  • Imports?System.Reflection??
  • Imports?System.Data.SqlClient??
  • Imports?Entity??
  • Imports?IDAL??
  • ??
  • Public?Class?DataAccess??
  • ?
  • #Region?"連接數(shù)據(jù)庫"??
  • ????Private?ReadOnly?connStr?As?String?=?ConfigurationManager.AppSettings("connStr")??
  • ????'''?<summary>??
  • ????'''?創(chuàng)建一個(gè)數(shù)據(jù)庫連接??
  • ????'''?</summary>??
  • ????'''?<returns></returns>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Public?Overloads?Function?CreateConn()?As?SqlConnection??
  • ????????Return?New?SqlConnection(connStr)??
  • ????End?Function??
  • #End?Region??
  • ?
  • #Region?"關(guān)閉相關(guān)對(duì)象"??
  • ????'''?<summary>??
  • ????'''?關(guān)閉SqlConnection對(duì)象??
  • ????'''?</summary>??
  • ????'''?<param?name="conn">連接數(shù)據(jù)庫</param>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Public?Sub?Close(ByVal?conn?As?SqlConnection)??
  • ????????conn.Close()??
  • ????????conn?=?Nothing??
  • ????End?Sub??
  • ??
  • ????'''?<summary>??
  • ????'''?關(guān)閉SqlCommand對(duì)象??
  • ????'''?</summary>??
  • ????'''?<param?name="cmd">sql命令</param>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Public?Sub?Close(ByVal?cmd?As?SqlCommand)??
  • ????????cmd.Dispose()??
  • ????????cmd?=?Nothing??
  • ????End?Sub??
  • #End?Region??
  • ??
  • ????'''?<summary>??
  • ????'''?為sql變量賦值并添加到SqlCommand中??
  • ????'''?</summary>??
  • ????'''?<param?name="cmd">SqlCommand命令</param>??
  • ????'''?<param?name="dbParam">參數(shù)名</param>??
  • ????'''?<param?name="dbType">參數(shù)類型</param>??
  • ????'''?<param?name="value">參數(shù)值</param>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Public?Sub?AddSqlParameter(ByVal?cmd?As?SqlCommand,?ByVal?dbParam?As?String,?ByVal?dbType?As?SqlDbType,?ByVal?value?As?Object)??
  • ????????Dim?sqlParam?As?SqlParameter?=?New?SqlParameter(dbParam,?dbType)??
  • ????????sqlParam.Value?=?value??
  • ????????cmd.Parameters.Add(sqlParam)??
  • ????End?Sub??
  • ??
  • End?Class??
  • ?

    ??????? DAL層下的DBuser類

    ??????? 同樣添加項(xiàng)目引用Entity和IDAL.

    [vb] view plaincopyprint?
  • Imports?System.Data.SqlClient??
  • Imports?Entity??
  • Imports?IDAL??
  • ??
  • Public?Class?DBuser??
  • ????'前面BLL沒有用抽象工廠的這里不用繼承DataAccess??
  • ????Inherits?DataAccess??
  • ????Implements?Iuser??
  • ??
  • ????Public?Function?Check(ByVal?entityUser?As?Entity.UserInfoEntity)?As?UserInfoEntity?Implements?IDAL.Iuser.Check??
  • ????????'這里的sql語句是為了以后的靈活性,將各個(gè)字段使用了常量來進(jìn)行表示,具體可參見實(shí)體層??
  • ????????Dim?sql?As?String?=?String.Format("select?*?from?userInfo?where?[userName]={0}?and?[password]={1}?and?[userLevel]={2}",?UserInfoEntity.DBPARAM_USERNAME,?UserInfoEntity.DBPARAM_PASSWORD,?UserInfoEntity.DBPARAM_USERLEVEL)??
  • ????????Dim?conn?As?SqlConnection?=?CreateConn()??
  • ????????Dim?cmd?As?SqlCommand?=?New?SqlCommand(sql,?conn)??
  • ????????Dim?sda?As?SqlDataAdapter?=?New?SqlDataAdapter(cmd)??
  • ????????Dim?ds?As?New?DataSet??
  • ??
  • ????????'向cmd中添加參數(shù)??
  • ????????AddSqlParameter(cmd,?UserInfoEntity.DBPARAM_USERNAME,?SqlDbType.VarChar,?entityUser.userName)??
  • ????????AddSqlParameter(cmd,?UserInfoEntity.DBPARAM_PASSWORD,?SqlDbType.VarChar,?entityUser.password)??
  • ????????AddSqlParameter(cmd,?UserInfoEntity.DBPARAM_USERLEVEL,?SqlDbType.VarChar,?entityUser.userlevel)??
  • ??
  • ????????Try??
  • ????????????conn.Open()??
  • ????????????sda.Fill(ds,?"userInfo")??
  • ????????????Dim?dr?As?DataRow?=?ds.Tables("userInfo").Rows(0)??
  • ????????????entityUser.LoadFromDataRow(dr)??
  • ????????????Return?entityUser??
  • ????????Catch?ex?As?Exception??
  • ????????????Return?Nothing??
  • ????????Finally??
  • ????????????Close(cmd)??
  • ????????????Close(conn)??
  • ????????End?Try??
  • ????End?Function??
  • End?Class??
  • ?

    ????? 抽象工廠+反射+配置文件

    [vb] view plaincopyprint?
  • Imports?System.Configuration??
  • Imports?System.Reflection??
  • Imports?IDAL??
  • ??
  • Public?Class?Factory??
  • ?
  • #Region?"配置加反射"??
  • ????Private?Shared?ReadOnly?AssemblyName?As?String?=?ConfigurationManager.AppSettings("AssemblyName")??
  • ????Private?Shared?ReadOnly?db?As?String?=?ConfigurationManager.AppSettings("db")??
  • ????'''?<summary>??
  • ????'''?實(shí)例化Iuser類型的DBuser類對(duì)象??
  • ????'''?</summary>??
  • ????'''?<returns>DBuser類對(duì)象</returns>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Public?Shared?Function?CreateUser()?As?Iuser??
  • ????????Dim?ClassName?As?String??
  • ????????ClassName?=?AssemblyName?+?"."?+?db?+?"user"??
  • ????????Return?CType(Assembly.Load(AssemblyName).CreateInstance(ClassName),?Iuser)??
  • ????End?Function??
  • #End?Region??
  • ??
  • End?Class??


  • 3.BLL層(封裝業(yè)務(wù)層):前提添加DAL,IDAL和Entity的引用

    [vb] view plaincopyprint?
  • Imports?IDAL??
  • Imports?Entity??
  • Imports?Factory??
  • ??
  • Public?Class?BllLogin??
  • ????'''?<summary>??
  • ????'''?查看登錄信息是否存在??
  • ????'''?</summary>??
  • ????'''?<param?name="entityUserInfo">窗體輸入的用戶信息</param>??
  • ????'''?<returns>登錄是否成功</returns>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Public?Function?CheckRecord(ByVal?entityUserInfo?As?UserInfoEntity)?As?Boolean??
  • ????????Dim?checkResult?As?Boolean??
  • ????????'下面聲明的iuser是實(shí)例化的Iuser類型的DBuser,實(shí)現(xiàn)了接口的調(diào)用(接口雖然不能被實(shí)例化,但是繼承它的類可實(shí)例化成接口類型)??
  • ????????Dim?iuser?As?Iuser??
  • ????????'此處運(yùn)用的是抽象工廠設(shè)計(jì)模式中的反射加配置,如果沒有用設(shè)計(jì)模式可以講下面的這句話改為:iuser=new?DBuser()??
  • ????????iuser?=?Factory.Factory.CreateUser()??
  • ??
  • ????????If?Not?IsNothing(iuser.Check(entityUserInfo))?Then??
  • ????????????checkResult?=?True??
  • ????????Else??
  • ????????????checkResult?=?False??
  • ????????End?If??
  • ??
  • ????????Return?checkResult??
  • ????End?Function??
  • End?Class??
  • 4.UI層(界面層)

    ??????? ?界面層的類,就是我們窗體類,又多少個(gè) 窗體,UI層就有多少個(gè)類。

    ??????? 下面我們看一下登錄窗體類。

    [vb] view plaincopyprint?
  • Imports?BLL??
  • Imports?Entity??
  • ??
  • Public?Class?frmLogin??
  • ????'登錄??
  • ????Private?Sub?btnLogin_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?btnLogin.Click??
  • ????????'判斷文本框是否為空??
  • ????????If?txtUserID.Text?=?""?Then??
  • ????????????MessageBox.Show("用戶名不能為空!")??
  • ????????????txtUserID.Focus()??
  • ????????????Return??
  • ????????End?If??
  • ??
  • ????????If?txtPassword.Text?=?""?Then??
  • ????????????MessageBox.Show("用戶名不能為空!")??
  • ????????????txtPassword.Focus()??
  • ????????????Return??
  • ????????End?If??
  • ??
  • ????????'填充參數(shù)記錄(此處調(diào)用的是實(shí)體層中實(shí)體類userInfo中的填充記錄Fill方法,后面會(huì)有介紹)??
  • ????????Dim?entityUserInfo?As?New?UserInfoEntity??
  • ????????entityUserInfo.Fill(Trim(txtUserID.Text),?Trim(txtPassword.Text),?Trim(cboUserLevel.Text))??
  • ??
  • ????????'驗(yàn)證用戶記錄(調(diào)用BLL層中的驗(yàn)證用戶記錄CheckRecord方法)??
  • ????????Dim?bllUserInfo?As?New?BllLogin??
  • ????????If?bllUserInfo.CheckRecord(entityUserInfo)?Then??
  • ????????????Me.Hide()??
  • ????????????frmMain.Show()??
  • ??
  • ????????????'判斷用戶級(jí)別??
  • ????????????'?……??
  • ????????????'添加用戶記錄??
  • ????????????'?……??
  • ????????Else??
  • ????????????MsgBox("登錄失敗",?vbOKOnly?+?vbInformation,?"登錄失敗")??
  • ????????????txtUserID.Focus()??
  • ????????????Exit?Sub??
  • ????????End?If??
  • ????End?Sub??
  • ??
  • ????'取消??
  • ????Private?Sub?btnCancel_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?btnCancel.Click??
  • ????????Me.Close()??
  • ????End?Sub??
  • ??
  • End?Class??
  • ?????

    ??????? 上面就是我在三層(UI→BLL→DAL)的基礎(chǔ)上加上設(shè)計(jì)模式抽象工程實(shí)現(xiàn)系統(tǒng)登錄的Demo,拿出來和大家一起分享,其中的不足之處,還希望大家多多指正。


    總結(jié)

    以上是生活随笔為你收集整理的机房收费系统之抽象工厂篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。