加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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">public interface 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图并写出代码。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读