日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/6/15 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机房收费系统之抽象工厂篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


??? 機房收費系統vb.net個人版已完成,在此過程中分層的好處在系統的完成過程中得到了很好的體會。第一遍用的是純三層做的,這幾天又在此基礎上又重構了登錄的demo,加上抽象工廠和配置文件的使用。下面以登錄功能為例,總結一下我的機房收費系統。

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

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

?

二、準備工作

???????創建數據表(課參見實體類中的代碼)

???????創建相應的類庫和窗體。

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

?

三、抽象各層的類

??????? 當我們確定了系統的整體架構,就要從宏觀到微觀的實現。

3.1 Entity(實體層)

??????? 數據庫設計好了,我們要根據數據庫中的表抽象實體類,系統中,實體類和表基本上是一一對象的。一個表映射一個實體類,表的字段即為實體類的屬性。

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

[vb] view plaincopyprint?
  • Public?Class?UserInfoEntity??
  • ?
  • #Region?"定義UserInfo表中各個屬性變量"??
  • ????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?"定義數據表中各個字段名常量"??
  • ????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?"定義數據表中各個字段參數變量"??
  • ????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>??
  • ????'''?獲取數據表中的一條記錄??
  • ????'''?</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>??
  • ????'''?填充一條記錄(登錄)到實體層??
  • ????'''?</summary>??
  • ????'''?<param?name="AuserName">用戶名</param>??
  • ????'''?<param?name="Apassword">密碼</param>??
  • ????'''?<param?name="AuserLevel">用戶級別</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?"定義數據表中各個屬性"??
  • ????'''?<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>??
  • ????'''?用戶權限??
  • ????'''?</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>??
  • ????'''?注冊日期??
  • ????'''?</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>??
  • ????'''?注冊時間??
  • ????'''?</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??
  • ?

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

    [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層(數據訪問層)

    ????接下來我們再看一下數據訪問層(DAL),這一層的主要任務是直接操作數據庫,完成對數據的增刪改查等。這里我們仍然根據數據表來抽象DAL層的類,基本上也是一個表對應一個類,這樣當我們增加新的表,直接增加新的DAL層類就可以,很好地符合了“開閉原則”。

    另外,因為DAL層的類是直接對數據庫進行操作的類,所以這個類里封轉大都有四種方法:增刪改查。但根據實際情況會有不同的參數,不同的返回值。

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

    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層實現IDAL接口

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

    ??????? 添加Configuration引用時需從.net子項目中查找,還要添加項目引用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?"連接數據庫"??
  • ????Private?ReadOnly?connStr?As?String?=?ConfigurationManager.AppSettings("connStr")??
  • ????'''?<summary>??
  • ????'''?創建一個數據庫連接??
  • ????'''?</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?"關閉相關對象"??
  • ????'''?<summary>??
  • ????'''?關閉SqlConnection對象??
  • ????'''?</summary>??
  • ????'''?<param?name="conn">連接數據庫</param>??
  • ????'''?<remarks>2013-5-9?by?liuhaiyan</remarks>??
  • ????Public?Sub?Close(ByVal?conn?As?SqlConnection)??
  • ????????conn.Close()??
  • ????????conn?=?Nothing??
  • ????End?Sub??
  • ??
  • ????'''?<summary>??
  • ????'''?關閉SqlCommand對象??
  • ????'''?</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">參數名</param>??
  • ????'''?<param?name="dbType">參數類型</param>??
  • ????'''?<param?name="value">參數值</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類

    ??????? 同樣添加項目引用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語句是為了以后的靈活性,將各個字段使用了常量來進行表示,具體可參見實體層??
  • ????????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中添加參數??
  • ????????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>??
  • ????'''?實例化Iuser類型的DBuser類對象??
  • ????'''?</summary>??
  • ????'''?<returns>DBuser類對象</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層(封裝業務層):前提添加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是實例化的Iuser類型的DBuser,實現了接口的調用(接口雖然不能被實例化,但是繼承它的類可實例化成接口類型)??
  • ????????Dim?iuser?As?Iuser??
  • ????????'此處運用的是抽象工廠設計模式中的反射加配置,如果沒有用設計模式可以講下面的這句話改為: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層(界面層)

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

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

    [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??
  • ??
  • ????????'填充參數記錄(此處調用的是實體層中實體類userInfo中的填充記錄Fill方法,后面會有介紹)??
  • ????????Dim?entityUserInfo?As?New?UserInfoEntity??
  • ????????entityUserInfo.Fill(Trim(txtUserID.Text),?Trim(txtPassword.Text),?Trim(cboUserLevel.Text))??
  • ??
  • ????????'驗證用戶記錄(調用BLL層中的驗證用戶記錄CheckRecord方法)??
  • ????????Dim?bllUserInfo?As?New?BllLogin??
  • ????????If?bllUserInfo.CheckRecord(entityUserInfo)?Then??
  • ????????????Me.Hide()??
  • ????????????frmMain.Show()??
  • ??
  • ????????????'判斷用戶級別??
  • ????????????'?……??
  • ????????????'添加用戶記錄??
  • ????????????'?……??
  • ????????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)的基礎上加上設計模式抽象工程實現系統登錄的Demo,拿出來和大家一起分享,其中的不足之處,還希望大家多多指正。


    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。