分享
 
 
 

C#设计模式之简单工厂篇

王朝c#·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

【案例】公司准备开发一套产品订单系统,客户强烈要求该系统能适应不同的数据库,即能让客户十分方便的决定到底是用SqlServer数据库还是Oracle数据库,或者其它数据库,而且数据库切换应该简单,决不能让客户麻烦得手忙脚乱。

遇到这种情况,最愚蠢的办法就是开发不同数据库版本的系统,即一套SqlServer版的订单系统,一套Oracle版的订单系统,但要真是这样干的话,我相信项目经理一定会获得千古蠢名。

“具体情况具体分析”,此时如果设计模式运用得恰到好处,省时、省力的高效软件工程就会立马出炉,且看我如何过招。

UML图如下:

首先定义一个接口,具体名为Idatabase,在这个接口中,定义好数据库操作的方法名和参数,以及返回值,本案例中我定义如下方法:

public interface IDatabase

{

bool Connect(string ConnectString);

bool Open();

bool Command(string SQL);

void Close();

}

重要提醒:“接口一生唯谨慎,定义大事不糊涂”,编写接口时一定要考虑周全,并对参数、返回值进行反复推敲,为什么?因为所有的实现类都是要根据该接口的规范进行代码具体编写,也即接口的定义是公用的,一旦改动了接口,后果就是所有的实现类也都必须相应调整。

然后就是编写具体的实现类了,客户要求多少不同类型的数据库,你就定义多少个Idatabase的实现类,虽然工作量大了点,可当你看到客户满意的笑容时,你心里也就会有一种由衷的幸福感,好了,SqlServer实现类代码如下:

public class SqlServer : IDatabase

{

SqlConnection conn;

SqlCommand command;

public bool Connect(string ConnectString)

{

try

{

conn = new SqlConnection(ConnectString);

return true;

}

catch(SqlException)

{

return false;

}

}

public bool Open()

{

try

{

conn.Open();

return true;

}

catch(SqlException)

{

return false;

}

}

public bool Command(string SQL)

{

try

{

command = new SqlCommand(SQL,conn);

command.ExecuteNonQuery();

return true;

}

catch(SqlException)

{

return false;

}

}

public void Close()

{

conn.Close();

conn.Dispose();

}

}

呵呵,有点长,咬着牙读完,心里明白了就会很舒服的,如果你现在有这种感觉了,好,再接再厉,再为Oracle实现类编写具体代码吧,依葫芦画瓢,大家有空就画一下吧,我就画个雏形了:

public class Oracle : IDatabase

{

public Oracle()

{

}

public bool Connect(string ConnectString)

{

return true;

}

public bool Open()

{

return true;

}

public bool Command(string SQL)

{

return true;

}

public void Close()

{

}

}

嗯,不错,你有多少种数据库就编写不同的实现类代码吧,这里就不赘述了,接下来呢?聪明的读者一定会想到这个问题:这个接口和这么多的实现类怎么用啊?我们再定义一个称之为工厂的类,由它来决定选用哪种数据库为进行操作,这个类比较简单:

public class Factory

{

public static IDatabase SelectDatabase(string DatabaseType)

{

switch(DatabaseType)

{

case "SqlServer":

return new SqlServer();

case "Oracle":

return new Oracle();

default:

return new SqlServer();

}

}

}

看明白了吗?好了,我们该让尊敬的、永远高贵的客户出场了,只有他,唯有他才有决定用哪种数据库的最高权限,你看,他这样用:

public class Client

{

public static void Main()

{

//Get the database information from Web.Config.

string DBType = ConfigurationSettings.AppSettings["DBType"];

string DBConnectString = ConfigurationSettings.AppSettings["DBConn"];

IDatabase DB = Factory.SelectDatabase(DBType);

//Connect the selected database.

if(DB.Connect(DBConnectString)==false)

{

Console.WriteLine("The database {0} can't be connected.",DBType);

return;

}

//Open database.

if(DB.Open()==false)

{

Console.WriteLine("The database {0} can't be opened, the connect string is {1}.",DBType,DBConnectString);

return;

}

//Execute SQL Command.

string SQL = "update Order set price = price * 0.07 where productID = '002'";

if(DB.Command(SQL))

{

//Do something...

}

else

{

Console.WriteLine("The Operator is not success. SQL statament is {0}",SQL);

DB.Close();

return;

}

DB.Close();

}

}

好了,工程峻工了,你们明白了没有?

思考题:简单工厂的应用场合和局限性?

作业题:假如要开发一个多媒体播放器,既能用Window MediaPlayer播放,又能用RealPlayer播放,还能用QuickTime播放,具体用什么播放器,由客户选择,请你画出UML图并写出代码。

待续…

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有