郁闷啊!刚刚花了两个个多小时写的文章没保存上。
工厂方法模式是面对因为具体的生产方法的不同,甚至在生产过程中,生产方法不停的变化的情况。顾名思义生产方法模式就是将方法抽象出来。O(∩_∩)O~,见笑了!理解的不对希望大家指正!
下面是小虾我自己写的例子:
发送信息因为发送方式的不同而产生不同的结果,似乎这个很适合抽象工厂模式,不过可以这样看,因为要发送一系列的不同种类信息的话,那么显然很适合抽象工厂模式,现在我选择发送的是单类信息比如招聘通知:只是通知的方式不同,可以电话,邮件等。
首先建立一个普通的信息类;
<summary>
/// 信息类
/// </summary>
public class MessageInfo
{
public void Phone()
{
Console.WriteLine("电话通知请回电");
}
public void Emile()
{
Console.WriteLine("写邮件通知请回执");
}
public void Write(string type)
{
switch (type)
{
case "phonetype":
Phone();
break;
case "Emile":
Emile();
break;
}
}
}
可以发现很难维护这个类因为每增加一个新的发送方式就要修改这个类,那么我进行一些必要的处理:
利用抽象工厂
///抽象出信息父类
public abstract class MessageInfo
{
public abstract void Write();
}
///电话子类
public class Phone : MessageInfo
{
public override void Write()
{
Console.WriteLine("电话通知请回电");
}
}
///Emile 子类
public class Emile : MessageInfo
{
public override void Write()
{
Console.WriteLine("写邮件通知请回执");
}
}
现在我们发现还是会有问题因为客户端每当变化通知方式的时候我们都会进行修改,那么我们是否还可以偷懒呢?现在工厂方法模式登场了:打开闪光灯,看清楚了!(⊙v⊙)嗯
把发送的方法抽象出来:
// <summary>
/// MessageInfoFactory类
/// </summary>
public abstract class MessageInfoFactory
{
public abstract MessageInfo Create();
}
具体的发送方法需要具体的方法实现
public class PhoneFactory
{
public Phone Create()
{
return new Phone();
}
}
public class EmileFactory
{
public Emile Create()
{
return new Emile();
}
}
这样在客户端我们利用反射工厂会得到一个很完善的代码:
public static void Main(string[] args)
{
string strfactoryName = ConfigurationSettings.AppSettings["factoryName"];
MessageInfoFactory factory;
factory = (MessageInfoFactory)Assembly.Load("MessageInfoFactory").CreateInstance("MessageInfoFactory." + strfactoryName);
MessageInfo MessageInfo = factory.Create();
MessageInfo.Write();
}
即使我们需要发送新的种类信息也就是多一个抽象工厂的配置key.
总结:工厂方法模式就是应用在方法不停变换,或者需要将生产方法延迟到子类,或者扩展等情况的!
因为文章丢失的原因,重写的时候感觉有些燥,耐心磨没了!写的很简单。也很少,只是希望有助于理解吧!精简了也就是原来的1/3!