简单工厂模式就是根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个共同的父类和共同的方法,但是每个方法执行的任务不同,而且根据不同的数据进行了优化。比如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();
这种方法把和数据相关的问题与类的其它的方法分隔开来。
一下次在实验“工厂方法模式(Factory Method Pattern”.