在OO程序中,我们经常看到的一种模式就是简单工厂模式(SimpleFactoryPattem)。简单工
厂模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的
父类和共同的方法,但每个方法执行的任务不同,而且根据不同的数据进行了优化。简单工厂模式
实际上不属于23个GoF模式,但它可以作为我们稍后要讨论的工厂方法模式的一个引导。
简单工厂模式如何工作
为了理解简单工厂模式,我们来看图8.1中的类图。在该图中,X是一个基类,XY类和XZ类
从它派生出来,类根据给出的参数决定返回哪一个子类。在右边定义了一个方法,
传递给它某个值(如abc),然后返回类X的某个实例。返回哪一个类的实例与程序员无关,因为这
些类有同样的方法,只是实现不同。返回哪一个类的实例完全取决于工厂,工厂功能可能很复杂,
但通常都是相当简单的。

示例代码
接下来考虑一个简单的C#例子,在它里面用到了Factory类。假设我们有一个输入窗体,允许
用户输入他的姓名,可以是"firstname lastname"形式或"lastname,firstname"形式。现在进一步
简化这个问题,假设我们总是能通过判断lastname和firstname之间是否有逗号来确定姓名的顺序。
这是一个相当容易做出的判断,可以在类中用一个简单的评语句实现,但是,我们这里是用它
说明工厂如何工作以及工厂能生成哪些对象。先定义一个简单的类,它用构造函数接收表示名字的
字符串,并且可以从类中取回名字。
csharp
public class Namer
{
protected string frName,lName;
public string getFrname()
{
return frName;
}
public string getLname()
{
return _Name;
}
}
注意,在这个基类里没有设置名序的构造函数。
两个派生类
接下来编写两个非常简单的派生类,它们实现了接口,并在构造函数中将名字分成了两部分。
在FirstFirst类中,做了一个简单的假设:最后一个空格前面的所有部分都属于firstname。
csharp
public class FirstFirst:Namer{
public FirstFirst(string name)
{
int i=name.Trim().IndexOf(" ");
if(i>0)
{
frName=name.Substring(0,i).Trim();
lName=name.Substring(i+1).Trim();
}
else
{
lName=name;
frName="";
}
}
}
在LastFirst类里,用逗号给lastname划分界限。当空格或逗号不存在时,两个类里都提供了错
误校正处理。
csharp
public class LastFirst:Namer
{
public LastFirst(string name)
{
int i=name.IndexOf(",");
if(i>0)
{
lName=name.Substring(0,i);
frName=name.Substring(i+1).Trim();
}
else
{
lName=name;
frName="";
}
}
}
两种情况下,我们把拆分后的名字分别保存在基类Namer中的保护变量和frName里。
注意,在派生类里根本不需要任何getFrname和getLname方法,因为已经在基类里给出来了。