工厂模式
简介
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法是一个类的实例化延迟到其子类。
后期对操作扩展时只需要添加实例化接口的方法,不需要修改。
例子
还举简单工厂模式中的例子。
分割名字的方法
classSplitName
{
privatestring frName, lName;
publicstring LName
{
get { return lName; }
set { lName = value; }
}
publicstring FrName
{
get { return frName; }
set { frName = value; }
}
}
继承封方法的子类
逗号分割方法
public CommaSplit(string name)
{
int i = name.IndexOf(",");
if (i > 0)
{
FrName = name.Substring(0, i);
LName = name.Substring(i + 1);
}
else
{
FrName = name;
LName = "";
}
}
空格分割方法
classBlankSplit : SplitName
{
public BlankSplit(string name)
{
int i = name.IndexOf(" ");
if (i > 0)
{
FrName = name.Substring(0, i);
LName= name.Substring(i + 1);
}
else
{
FrName = name;
LName = "";
}
}
}
工厂
工厂用于创建分割姓名的对象
接口
interfaceIFactoryFunction
{
SplitName CreateSplitObject(string name);
}
创建逗号分割的对象
classCommaObject : IFactoryFunction
{
publicSplitName CreateSplitObject(string name)
{
returnnewCommaSplit(name);
}
}
空格分割
classBlankObject : IFactoryFunction
{
publicSplitName CreateSplitObject(string name)
{
returnnewBlankSplit(name);
}
}
客户端使用
staticvoid Main(string[] args)
{
Console.WriteLine("请输入你的姓名");
string inputName = Console.ReadLine();
IFactoryFunction operFactory = newCommaObject();//创建工厂用逗号分割
SplitName splitName =operFactory.CreateSplitObject(inputName);//实例化分割的对象
Console.WriteLine("姓"+splitName.FrName);
Console.WriteLine("名"+splitName.LName);
Console.ReadKey(true);
}
总结
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。工厂方法把简单工厂的内部逻辑判断移到了客户端来进行。