工厂模式

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

  

 

posted on 2017-08-07 22:42  MojoJojo  阅读(136)  评论(0)    收藏  举报

导航