简单工厂模式实际上不属于23个GoF模式中的一种。
简单工厂模式是通过传入的数据返回几种可能类中的一种类的实例。但这几种类一般会有一个共同特点是,这几种类都有一个共同的父类和共同的方法,但每个方法执行的内容不同,而且根据不同的数据进行优化。
下面看个例子:
假设我们总是可以通过逗号或者分号来把一个名字分成firstname和lastname。用工厂模式如何实现那?
1、两个派生类
//基础类
public class Name
{
protected string fName;
protected string lName;
//只有基类有
public class Name
{
protected string fName;
protected string lName;
//只有基类有
public string GetFirstName()
{
return fName;
}
//只有基础类
public string GetLastName(){
return lName;
}
}
//Firstname
public class FirstName : Name
{
public FirstName(string name)
{
int k = name.Trim().IndexOf(';');
if (k > -1)
{
base.fName = name.Substring(0, k);
base.lName = name.Substring(k + 1);
}
else
{
base.fName = name;
base.lName = string.Empty;
}
}
}
//Lastname
public class LastName : Name
{
public LastName(string name)
{
int k = name.Trim().IndexOf(',');
if (k > -1)
{
fName = name.Substring(0, k);
lName = name.Substring(k + 1);
}
else
{
fName = string.Empty;
lName = name;
}
}
}
2、工厂类
//工厂类
public class Factory
{
//判断区别,返回其中一个派生类实例
public Name GetName(string name)
{
if (name.IndexOf(',') > -1)
{
return new LastName(name);
}
else
{
return new FirstName(name);
}
}
}
public class Factory
{
//判断区别,返回其中一个派生类实例
public Name GetName(string name)
{
if (name.IndexOf(',') > -1)
{
return new LastName(name);
}
else
{
return new FirstName(name);
}
}
}
3、使用工厂类
//声明工厂
Factory fact = new Factory();
//获取派生类
Name name = fact.GetName("firstname;11lastname");
Console.WriteLine(name.GetFirstName() + "@@" + name.GetLastName());
Factory fact = new Factory();
//获取派生类
Name name = fact.GetName("firstname;11lastname");
Console.WriteLine(name.GetFirstName() + "@@" + name.GetLastName());
我们知道,简单工厂能够返回具有相同方法的实例,他们可以是不同的派生子类的实例,也可以是实际上毫无关系仅仅是提供了相同接口的类。不管那一种形式,这些类实例中的方法必须相同的,并且能够被交替使用。