工厂模式
1.简单工厂模式
创建一个工厂类,对实现了同一接口的类进行实例的创建。

//定义接口
public interface ISender
{
void Send();
}
//发送邮件实现ISender 接口
class EmailSender : ISender
{
public void Send()
{
Console.WriteLine("发送邮件");
}
}
//发送短信实现ISender 接口
class SmsSender : ISender
{
public void Send()
{
Console.WriteLine("发送短信");
}
}
//简单工厂模式: 建立一个工厂类, 对实现了同一接口的一些类进行实例的创建
//缺点: 类的创建依赖工厂类,如果想要扩展程序,必须对工厂类进行修改,违反了开闭原则原则。
public class SimpleFactory
{
public ISender Produce(string type) {
if (type.ToLower() == "sms")
{
return new SmsSender();
}
else if (type.ToLower() == "email")
{
return new EmailSender();
}
else
{
return null;
}
}
}
//测试代码
SimpleFactory simpleFactory = new SimpleFactory();
ISender sender = simpleFactory.Produce("email");
sender.Send();
2.工厂方法模式
是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法(工厂方法可以是静态的),分别创建对象。

//定义接口
public interface ISender
{
void Send();
}
//发送邮件实现ISender 接口
class EmailSender : ISender
{
public void Send()
{
Console.WriteLine("发送邮件");
}
}
//发送短信实现ISender 接口
class SmsSender : ISender
{
public void Send()
{
Console.WriteLine("发送短信");
}
}
//工厂方法模式:是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象
//缺点:同简单工厂,违反开闭原则
public class MethodFactory
{
public ISender ProduceSms()
{
return new SmsSender();
}
public ISender ProduceMail()
{
return new EmailSender();
}
//以上两个方法改为静态方法,则为静态工厂方法模式,不需要实例化此工厂类
//public static ISender ProduceSms()
//{
// return new SmsSender();
//}
//public static ISender ProduceMail()
//{
// return new EmailSender();
//}
}
//测试代码
MethodFactory methodFactory = new MethodFactory();
ISender sender2 = methodFactory.ProduceSms();
sender2.Send();
3.抽象工厂模式
创建多个工厂类,一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

//定义接口
public interface ISender
{
void Send();
}
//发送邮件实现ISender 接口
class EmailSender : ISender
{
public void Send()
{
Console.WriteLine("发送邮件");
}
}
//发送短信实现ISender 接口
class SmsSender : ISender
{
public void Send()
{
Console.WriteLine("发送短信");
}
}
public interface IProvider {
ISender produce();
}
public class SendSmsFactory : IProvider
{
public ISender produce()
{
return new SmsSender();
}
}
public class SendEmailFacotory : IProvider
{
public ISender produce()
{
return new EmailSender();
}
}
//测试代码
IProvider provider = new SendEmailFacotory();//需要发短信时替换成SendSmsFactory
//要高级点,也可以通过反射实现,"FactoryDemo"是程序集,"FactoryDemo.AbstractFactoryDemo.SendEmailFacotory"是命名空间.类名
//IProvider provider = (IProvider)Assembly.Load("FactoryDemo").CreateInstance("FactoryDemo.AbstractFactoryDemo.SendEmailFacotory");
ISender sender3 = provider.produce();
sender3.Send();
//还要再高级点,就用IOC容器依赖注入了,比如Autofac
浙公网安备 33010602011771号