简单工厂模式就是根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个共同的父类和共同的方法,但是每个方法执行的任务不同,而且根据不同的数据进行了优化。比如X是一个基类,xy和xz是从它派生出来的,XFactory类根据给出的参数决定返回那一个子类,返回那一个类的实例与程序员无关,因为这些类有同样的方法,只是实现不同,返回那个类的实例取决于工厂,工厂功能可能很复杂,但通常都是相当简间的.
接下来我们用一个例子来说明这个简单的工厂模式.假如我们要输入一个人的姓名,
有两个方式,一种是“firstname lastname” 和“fristname,lastname”形式.我们的任务就是要确定lastname和firstname是否是逗号来确定姓名的先后.
第一步,设计一个父类:
public class CName
{
protected string frName ,lName;
public string getFristName() { return frName;}
public string getLastName() { return lName;}
}
第二步,设计两个子类,它是由类CName的派生的。它们现实了接口,并在构造function中将名字分成了两部分.在CFirstFirst类中,做了一个简单的假设:最后一个空格前面的所有部分都属与firstname.
public class CFirstFirst : CName
{
public CFirstFirst (string sName)
{
int i = sName.Trim().Indexof(” “);
if ( i >0 )
{
frName = name.Substring(0,i).Trim();
lName = name.Substring(i+1).Trim();
}
else
{
lName = sName;
frName = “”;
}
}
}
在LastFist类中,用逗号给lastname划分界限.当空格或逗号不存在时,两个类都提供了错误校正处理.
public class LastFrist :CName
{
public LastFrist(string sName)
{
int i = sName.Indexof(”,”);
if ( i>0 )
{
if ( i >0 )
{
lName = name.Substring(0,i).Trim();
frName = name.Substring(i+1).Trim();
}
else
{
lName = sName;
frName = “”;
}
}
}
}
两种情况下,都把分开的名字保存在基类的CName中保护变量中.所以在派生类中根本不需要任何getFirstName和getLastName方法,因为基类中已给出.
第三步: 构造简单工厂.
现在很容易给出简单工厂类.只检查逗号来决定返回那个类的实例
public class NameFactory ()
{
public CName getName(string sname)
{
int i = sname.Indexof(”,”);
if ( i >0 )
{
return new LastFrist (sname);
}
else
{
return new CFirstFirst (sname);
}
}
}
第四步。使用工厂类:
string sName = “cedy hao”;
NameFactory nf = new NameFactory ();
CName name = nf.getName(sName);
string sFristName = name.getFristName();
string sLastName = name.getLastName();
这种方法把和数据相关的问题与类的其它的方法分隔开来。采用抽象工厂模式设计出的系统类图如下:
数据库层抽象工厂解决方案归档:
(1)AbstractDbFactory.cs
using System;
using System.Data;
namespace DbService
{
/// <summary>
/// 数据库抽象工厂接口
/// </summary>
public interface AbstractDbFactory
{
/// <summary>
/// 建立默认连接
/// </summary>
/// <returns>数据库连接</returns>
IDbConnection CreateConnection();
/// <summary>
/// 根据连接字符串建立Connection对象
/// </summary>
/// <param name="strConn">连接字符串</param>
/// <returns>Connection对象</returns>
IDbConnection CreateConnection(string strConn);
/// <summary>
/// 建立Command对象
/// </summary>
/// <returns>Command对象</returns>
IDbCommand CreateCommand();
<