工厂模式
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