在OO程序中,我们经常看到一种模式就是简单工厂模式(Simple Factory Pattern),简单工程模式根据提供给它的数据,返回几个可能类中的一个类的实例。下面我们就以一个简单的例子来说明一下简单工厂模式。
假设我们有一个输入窗体,允许用户输入他们的名字,可以是 firstname lastname 或者是lastname,firstname的,我们通过判断用户输入的名字是否有逗号来判断哪一部分是firstname,哪一部分是lastname。
先定义一个简单的类,它用构造函数接收表示名字的字符串,并且可以从类中取回名字。
{
protected string frName, lName;
public string getFrname()
{
return frName;
}
public string getlNmae()
{
return lName;
}
}
接下来编写两个非常简单的派生类,他们实现了Namer方法,并在构造函数中将名字分成了两部分。
在FirstFirst类中,做了一个简单的假设,最后一个空格签名的所有部分都属于firstname。
{
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 = "";
}
}
}
{
public LastFirst(string name)
{
int i = name.Trim().IndexOf(" ");
if (i > 0)
{
lName = name.Substring(0, i);
frName = name.Substring(i + 1).Trim();
}
else
{
lName = name;
frName = "";
}
}
}
两种情况下,我们把拆分后的名字分别保存在基类Namer的保护变量lName和frName中,注意,在派生类里根本不需要任何getFrname和getLname方法,因为已经在基类中给出。
下面就很容易给出简单工厂类。只要检测逗号是否存在,然后返回其中的一个类即可。
{
public NameFactory() { }
public Namer getName(string name)
{
int i = name.IndexOf(",");
if (i > 0)
{
return new LastFirst(name);
}
else
{
return new FirstFirst(name);
}
}
}
接下来看看怎么样把上述部分组合在一起。
{
Namer name = new NameFactory().getName(txtName.Text);
txtFirstName.Text = name.getFrname();
txtLastName.Text = name.getlNmae();
}
下图就是得到的效果
这就是简单工厂模式的基本原理了,创建一个抽象工厂,它决定返回哪一个类的实例并将该实例返回。
简单工厂模式实际上不属于23种GoF模式。