设计模式之四(抽象工厂模式第一回合)
前言
首先關(guān)于抽象工廠模式的學(xué)習(xí),我們需要慢慢的,由淺入深的進(jìn)入。不能單刀直入,否則可能達(dá)不到預(yù)期學(xué)明白的目標(biāo)。
第一回合
?首先我們從最簡(jiǎn)單的數(shù)據(jù)訪問程序開始吧。
下面先來看一個(gè)簡(jiǎn)單的小例子,代碼很簡(jiǎn)單
public class User {public int ID{get;set;}public string Name{get;set;} }一個(gè)簡(jiǎn)單的實(shí)體類,也相當(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;} }然后建立一個(gè)類庫來操作上面建立的User實(shí)體類,也就是向User表中添加一條記錄,或者通過ID獲得一條記錄,兩個(gè)類庫操作方法。
public class Test {public static void Main(){User user=new User();SqlServerUser su=new SqlServerUser();su.Insert(user);su.GetUser(1);Console.ReadLine();} }最后我們通過在控制臺(tái)程序中進(jìn)行簡(jiǎn)單的調(diào)用。第一調(diào)用插入一條記錄,然后通過ID=1獲取一條記錄。
可以看出,現(xiàn)在的實(shí)現(xiàn)非常的簡(jiǎn)單。那么現(xiàn)在我們來想一個(gè)問題。剛剛我們上面的實(shí)現(xiàn)是在SQL Server數(shù)據(jù)庫的基礎(chǔ)上。那么現(xiàn)在有個(gè)需求,是要將現(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)對(duì)象,我本以為將其對(duì)應(yīng)的全部替換,局可以使用了,結(jié)果替換后,錯(cuò)誤百出。
原來兩者有不少的地方在使用的時(shí)候死不同的。
比如:
1.在插入數(shù)據(jù)時(shí),Access必須要insert into 而Sql Server可以不用into的;
2.Sql Server中的GetDate()在Access中沒有,需要改成Now();
3.Sql Server中字符串含糊Substring,而在Access中根本不能用;
4.這些問題還好了,也不是什么大問題。原來Access對(duì)一些關(guān)鍵字,例如password是不能作為數(shù)據(jù)庫的字段的,如果密碼的字段名是password,Sql Server 中什么問題都沒有,運(yùn)行正常,在Access中就會(huì)報(bào)錯(cuò),而且錯(cuò)誤讓人莫名其妙。?后來知道了原來關(guān)鍵字應(yīng)該用‘[’和‘]’包起來,不然當(dāng)然是容易出錯(cuò)的。
5.主要網(wǎng)站要維護(hù),比如修改或增加一些功能,我們就需要修改兩個(gè)項(xiàng)目,至少在數(shù)據(jù)庫中做改動(dòng),相應(yīng)的程序代碼都要改,甚至和數(shù)據(jù)庫不相干的代碼也要改,兩個(gè)不同的版本,兩倍的工作量呀。
6.假如哪天要用Oracle數(shù)據(jù)庫,那又要折騰一陣子了。
現(xiàn)在我們?cè)賮矸治鱿聞倓偵厦娴男±邮遣荒軗Q數(shù)據(jù)庫的,因?yàn)榫驮谟赟qlServerUser su=new SqlServerUser()使得su這個(gè)對(duì)象被框死在Sql Server上了。如果這里是靈活的,專業(yè)店的說法,是多態(tài)的,那么在執(zhí)行su.Insert(user)和su.GetUser(1)時(shí)就不用考慮是在用Sql Server還是在Access。
想一想前面我學(xué)習(xí)的工廠方法模式,它就是定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化那一個(gè)類。
工廠方法模式來優(yōu)化數(shù)據(jù)庫訪問程序
?先來看一下簡(jiǎn)單的UML類圖關(guān)系
看上去很簡(jiǎn)單,下面我們來用代碼實(shí)現(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
SqlServerUser類,用于訪問Sql Server的User。 AccessUser類,用于訪問Access的User。
接下來,建立IFactory接口,定義一個(gè)創(chuàng)建訪問User表對(duì)象的抽象的工廠接口。
interface IFactory{IUser CreateUser();}SqlServerFactory類,實(shí)現(xiàn)IFactory接口,實(shí)例化SqlServerUser.
public class SqlServerFactory : IFactory{public IUser CreateUser(){return new SqlServerUser();}}AccessFactory類,實(shí)現(xiàn)IFactory接口,實(shí)例化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)在只是對(duì)一個(gè)User表的操作,如果再加一個(gè)部門表Department表,該如何處理呢,一個(gè)網(wǎng)站,一個(gè)項(xiàng)目,不可能只有一個(gè)表,會(huì)有幾十張表,甚至更多,那該如何處理呢,這些問題將會(huì)在抽象工廠模式的第二回合進(jìn)行處理。
總結(jié)
以上是生活随笔為你收集整理的设计模式之四(抽象工厂模式第一回合)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .dex文件结构学习笔记(4)
- 下一篇: Add-in Express for O