C#设计模式之简单工厂篇(转载)
发布时间:2020-12-15 04:39:03 所属栏目:百科 来源:网络整理
导读:?首先定义一个接口,具体名为Idatabase,在这个接口中,定义好数据库操作的方法名和参数,以及返回值,本案例中我定义如下方法: p style="FONT-SIZE: 10pt"public interface IDatabase p style="FONT-SIZE: 10pt"{ p style="FONT-SIZE: 10pt"?? bool Connect
?首先定义一个接口,具体名为Idatabase,在这个接口中,定义好数据库操作的方法名和参数,以及返回值,本案例中我定义如下方法: <p style="FONT-SIZE: 10pt">{ <p style="FONT-SIZE: 10pt">?? bool Connect(string ConnectString); <p style="FONT-SIZE: 10pt">??? bool Open(); <p style="FONT-SIZE: 10pt">??? bool Command(string SQL); <p style="FONT-SIZE: 10pt">??? void Close(); <p style="FONT-SIZE: 10pt">} <p style="FONT-SIZE: 10pt">??? 重要提醒:“接口一生唯谨慎,定义大事不糊涂”,编写接口时一定要考虑周全,并对参数、返回值进行反复推敲,为什么?因为所有的实现类都是要根据该接口的规范进行代码具体编写,也即接口的定义是公用的,一旦改动了接口,后果就是所有的实现类也都必须相应调整。 <p style="FONT-SIZE: 10pt">??? 然后就是编写具体的实现类了,客户要求多少不同类型的数据库,你就定义多少个Idatabase的实现类,虽然工作量大了点,可当你看到客户满意的笑容时,你心里也就会有一种由衷的幸福感,好了,SqlServer实现类代码如下: <p style="FONT-SIZE: 10pt">public class SqlServer : IDatabase <p style="FONT-SIZE: 10pt">??? { <p style="FONT-SIZE: 10pt">??????? SqlConnection conn; <p style="FONT-SIZE: 10pt">??????? SqlCommand command; <p style="FONT-SIZE: 10pt">??????? public bool Connect(string ConnectString) <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? try <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? conn = new SqlConnection(ConnectString); <p style="FONT-SIZE: 10pt">??????????????? return true; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????????? catch(SqlException) <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? return false; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">? <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??????? public bool Open() <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? try <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? conn.Open(); <p style="FONT-SIZE: 10pt">??????????????? return true; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????????? catch(SqlException) <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? return false; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??????? public bool Command(string SQL) <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? try <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? command = new SqlCommand(SQL,conn); <p style="FONT-SIZE: 10pt">??????????????? command.ExecuteNonQuery(); <p style="FONT-SIZE: 10pt">??????????????? return true; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????????? catch(SqlException) <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? return false; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??????? public void Close() <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? conn.Close(); <p style="FONT-SIZE: 10pt">??????????? conn.Dispose(); <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??? }?呵呵,有点长,咬着牙读完,心里明白了就会很舒服的,如果你现在有这种感觉了,好,再接再厉,再为Oracle实现类编写具体代码吧,依葫芦画瓢,大家有空就画一下吧,我就画个雏形了: <p style="FONT-SIZE: 10pt">public class Oracle : IDatabase <p style="FONT-SIZE: 10pt">??? { <p style="FONT-SIZE: 10pt">??????? public Oracle() <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??????? public bool Connect(string ConnectString) <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? return true; <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??????? public bool Open() <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? return true; <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??????? public bool Command(string SQL) <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? return true; <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??????? public void Close() <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??? } <p style="FONT-SIZE: 10pt">??? 嗯,不错,你有多少种数据库就编写不同的实现类代码吧,这里就不赘述了,接下来呢?聪明的读者一定会想到这个问题:这个接口和这么多的实现类怎么用啊?我们再定义一个称之为工厂的类,由它来决定选用哪种数据库为进行操作,这个类比较简单: <p style="FONT-SIZE: 10pt">public class Factory <p style="FONT-SIZE: 10pt">??? { <p style="FONT-SIZE: 10pt">??????? public static IDatabase SelectDatabase(string DatabaseType) <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? switch(DatabaseType) <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? case "SqlServer": <p style="FONT-SIZE: 10pt">??????????????????? return new SqlServer(); <p style="FONT-SIZE: 10pt">??????????????? case "Oracle": <p style="FONT-SIZE: 10pt">??????????????????? return new Oracle(); <p style="FONT-SIZE: 10pt">??????????????? default: <p style="FONT-SIZE: 10pt">??????????????????? return new SqlServer(); <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??? }看明白了吗?好了,我们该让尊敬的、永远高贵的客户出场了,只有他,唯有他才有决定用哪种数据库的最高权限,你看,他这样用: <p style="FONT-SIZE: 10pt">public class Client <p style="FONT-SIZE: 10pt">??? { <p style="FONT-SIZE: 10pt">??????? public static void Main() <p style="FONT-SIZE: 10pt">??????? { <p style="FONT-SIZE: 10pt">??????????? //Get the database information from Web.Config. <p style="FONT-SIZE: 10pt">??????????? string DBType = ConfigurationSettings.AppSettings["DBType"]; <p style="FONT-SIZE: 10pt">??????????? string DBConnectString = ConfigurationSettings.AppSettings["DBConn"]; <p style="FONT-SIZE: 10pt">??????????? IDatabase DB = Factory.SelectDatabase(DBType); <p style="FONT-SIZE: 10pt">??????????? //Connect the selected database. <p style="FONT-SIZE: 10pt">??????????? if(DB.Connect(DBConnectString)==false) <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? Console.WriteLine("The database {0} <a href="mailto:can@#t"><font color="#000000" size="2">can@#t be connected.",DBType); <p style="FONT-SIZE: 10pt">??????????????? return; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????????? //Open database. <p style="FONT-SIZE: 10pt">??????????? if(DB.Open()==false) <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? Console.WriteLine("The database {0} <a href="mailto:can@#t"><font color="#000000" size="2">can@#t be opened,the connect string is {1}.",DBType,DBConnectString); <p style="FONT-SIZE: 10pt">??????????????? return; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????????? //Execute SQL Command. <p style="FONT-SIZE: 10pt">??????????? string SQL = "update Order set price = price * 0.07 where productID = @#002@#"; <p style="FONT-SIZE: 10pt">??????????? if(DB.Command(SQL)) <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? //Do something... <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????????? else <p style="FONT-SIZE: 10pt">??????????? { <p style="FONT-SIZE: 10pt">??????????????? Console.WriteLine("The Operator is not success. SQL statament is {0}",SQL); <p style="FONT-SIZE: 10pt">??????????????? DB.Close(); <p style="FONT-SIZE: 10pt">??????????????? return; <p style="FONT-SIZE: 10pt">??????????? } <p style="FONT-SIZE: 10pt">??????????? DB.Close(); <p style="FONT-SIZE: 10pt">??????? } <p style="FONT-SIZE: 10pt">??? } <p style="FONT-SIZE: 10pt">??? 好了,工程峻工了,你们明白了没有? <p style="FONT-SIZE: 10pt">??? 思考题:简单工厂的应用场合和局限性? <p style="FONT-SIZE: 10pt">??? 作业题:假如要开发一个多媒体播放器,既能用Window MediaPlayer播放,又能用RealPlayer播放,还能用QuickTime播放,具体用什么播放器,由客户选择,请你画出UML图并写出代码。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |