设计模式之四(抽象工厂模式第一回合)
前言
首先關(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
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .dex文件结构学习笔记(4)
- 下一篇: Add-in Express for O