在各位读这篇文章之前,我给大家一个提醒,我的文章也许称不上一个设计模式类的文章,只能算是自己在项目中的一个设计总结,在这里,我很欢迎大家和我一起讨论。但是同时我想说,我写博客的目的本身就是希望我的经验可以提醒他人,但是如果造成了一种相反的影响,那就违背我的初衷了,所以希望大家对我的观点思考,思考,再思考!另外,感谢Jake.NET,装配脑袋,横刀天笑等对我的鼓励。
1.代码引子
让我们由一段代码引出我们的这篇文章。
相信每个人,无论是B/S,还是C/S。都无可避免地要去和数据库打交道。那么这样的代码再常见不过:
static void Main(string[] args)
{
string connectionString = ".........";
SqlConnection thisConnection = new SqlConnection(connectionString);
string commandString = "select * from A";
using (thisConnection)
{
thisConnection.Open();
SqlCommand thisCommand = new SqlCommand(commandString, thisConnection);
thisCommand.ExecuteNonQuery();
}
}
这样的代码在平时无可争议,运行得也很棒。
可是我在公司就遇到过这样的情况,客户偏偏说,他们觉得SQL Server不好,不能满足什么什么的需求,虽然他说的是谬论,但是我们也必须得去满足客户的需求。
然后就去按照他们的要求去换成Oracle的数据库。却发现工作量非常非常大。于是这个单子就谈丢了。
错误出在哪里?
2.怎么样去修改?
string connectionString = ".............";
OracleConnection thisConnection = new OracleConnection(connectionString);
string commandString = "select * from A";
using (thisConnection)
{
thisConnection.Open();
OracleCommand thisCommand = new OracleCommand(commandString, OracleConn);
thisCommand.ExecuteNoQuery();
}
每一处,我们都需要把代码改成这个样子,我么知道,在一个程序中,涉及到数据库操作的代码是无处不在的。这样大的工作量,果然不是短时间内可以完成的。更重要的是,很可能因为疏漏而让一个操作完蛋………
3.引出抽象工厂
我一直没搞明白这个名字是什么意义,为什么是抽象工厂呢??
这个问题我们不去讨论了。步入正式话题,让我们看看究竟什么是抽象工厂,他的目的是什么?
提供一个创建一系列相关相关或互相依赖对象的接口,而无需指定他们具体的类。
接下来还是老套路,让我们看看他的UML图: