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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式之四(抽象工厂模式第一回合)

發(fā)布時間:2025/3/19 asp.net 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之四(抽象工厂模式第一回合) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

首先關(guān)于抽象工廠模式的學(xué)習(xí),我們需要慢慢的,由淺入深的進(jìn)入。不能單刀直入,否則可能達(dá)不到預(yù)期學(xué)明白的目標(biāo)。

第一回合  

?首先我們從最簡單的數(shù)據(jù)訪問程序開始吧。

下面先來看一個簡單的小例子,代碼很簡單

public class User {public int ID{get;set;}public string Name{get;set;} }

一個簡單的實體類,也相當(dāng)于在SqlServer數(shù)據(jù)庫中建立了相同的數(shù)據(jù)表

public class SqlServerUser {public void Insert(User user){Console.WriteLine("在SQL Server 中給User表增加一條記錄");}public User GetUser(int id){Console.WriteLine("在SQL Server 中根據(jù)ID得到User表一條記錄");return null;} }

然后建立一個類庫來操作上面建立的User實體類,也就是向User表中添加一條記錄,或者通過ID獲得一條記錄,兩個類庫操作方法。

public class Test {public static void Main(){User user=new User();SqlServerUser su=new SqlServerUser();su.Insert(user);su.GetUser(1);Console.ReadLine();} }

最后我們通過在控制臺程序中進(jìn)行簡單的調(diào)用。第一調(diào)用插入一條記錄,然后通過ID=1獲取一條記錄。

可以看出,現(xiàn)在的實現(xiàn)非常的簡單。那么現(xiàn)在我們來想一個問題。剛剛我們上面的實現(xiàn)是在SQL Server數(shù)據(jù)庫的基礎(chǔ)上。那么現(xiàn)在有個需求,是要將現(xiàn)有的數(shù)據(jù)庫SQL Server改為Access數(shù)據(jù)庫的話,我們應(yīng)該怎么辦呢?

SQL Server和Access在ADO.NET上的使用是不同的,在SQL Server上用的是System.Data.SqlClient命名空間下的SqlConnection、SqlCommand、SqlParameter、SqlDataReader、SqlDataAdapter,而Access則要用System.Data.OleDb命名空間下的相應(yīng)對象,我本以為將其對應(yīng)的全部替換,局可以使用了,結(jié)果替換后,錯誤百出。

原來兩者有不少的地方在使用的時候死不同的。

比如:

1.在插入數(shù)據(jù)時,Access必須要insert into 而Sql Server可以不用into的;

2.Sql Server中的GetDate()在Access中沒有,需要改成Now();

3.Sql Server中字符串含糊Substring,而在Access中根本不能用;

4.這些問題還好了,也不是什么大問題。原來Access對一些關(guān)鍵字,例如password是不能作為數(shù)據(jù)庫的字段的,如果密碼的字段名是password,Sql Server 中什么問題都沒有,運行正常,在Access中就會報錯,而且錯誤讓人莫名其妙。?后來知道了原來關(guān)鍵字應(yīng)該用‘[’和‘]’包起來,不然當(dāng)然是容易出錯的。

5.主要網(wǎng)站要維護(hù),比如修改或增加一些功能,我們就需要修改兩個項目,至少在數(shù)據(jù)庫中做改動,相應(yīng)的程序代碼都要改,甚至和數(shù)據(jù)庫不相干的代碼也要改,兩個不同的版本,兩倍的工作量呀。

6.假如哪天要用Oracle數(shù)據(jù)庫,那又要折騰一陣子了。

現(xiàn)在我們再來分析下剛剛上面的小例子是不能換數(shù)據(jù)庫的,因為就在于SqlServerUser su=new SqlServerUser()使得su這個對象被框死在Sql Server上了。如果這里是靈活的,專業(yè)店的說法,是多態(tài)的,那么在執(zhí)行su.Insert(user)和su.GetUser(1)時就不用考慮是在用Sql Server還是在Access。

想一想前面我學(xué)習(xí)的工廠方法模式,它就是定義一個用于創(chuàng)建對象的接口,讓子類決定實例化那一個類。

工廠方法模式來優(yōu)化數(shù)據(jù)庫訪問程序

?先來看一下簡單的UML類圖關(guān)系

看上去很簡單,下面我們來用代碼實現(xiàn)一下:

IUser接口,用于客戶端訪問,解除與具體數(shù)據(jù)庫訪問的耦合。

public class User{public int ID{get;set;}public string Name{get;set;}}interface IUser{void Insert(User user);User GetUser(int id);}

在建立接口之前,當(dāng)然要準(zhǔn)備好User類。
接下來完成SqlServerUser和AccesssUser

public class SqlServerUser:IUser{public void Insert(User user){Console.WriteLine("在SQL Server 中給User表增加一條記錄");}public User GetUser(int id){Console.WriteLine("在SQL Server 中根據(jù)ID得到User表一條記錄");return null;}}public class AccessUser : IUser{public void Insert(User user){Console.WriteLine("在Access中給User表增加一條記錄");}public User GetUser(int id){Console.WriteLine("在Access中根據(jù)ID得到User表一條記錄");return null;}}

SqlServerUser類,用于訪問Sql Server的User。 AccessUser類,用于訪問Access的User。

接下來,建立IFactory接口,定義一個創(chuàng)建訪問User表對象的抽象的工廠接口。

interface IFactory{IUser CreateUser();}

SqlServerFactory類,實現(xiàn)IFactory接口,實例化SqlServerUser.

public class SqlServerFactory : IFactory{public IUser CreateUser(){return new SqlServerUser();}}

AccessFactory類,實現(xiàn)IFactory接口,實例化AccessUser。

public class AccessServerFavtory : IFactory{public IUser CreateUser(){return new AccessUser();}}

客戶端調(diào)用代碼

class Program{static void Main(string[] args){User user = new User();IFactory factory = new SqlServerFactory();IUser iu=factory.CreateUser();iu.Insert(user);iu.GetUser(1);Console.ReadLine();}}

?

前言

當(dāng)然現(xiàn)在只是對一個User表的操作,如果再加一個部門表Department表,該如何處理呢,一個網(wǎng)站,一個項目,不可能只有一個表,會有幾十張表,甚至更多,那該如何處理呢,這些問題將會在抽象工廠模式的第二回合進(jìn)行處理。

總結(jié)

以上是生活随笔為你收集整理的设计模式之四(抽象工厂模式第一回合)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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