zoukankan      html  css  js  c++  java
  • 简单工厂模式—>工厂模式

    一、功能

    根据前一篇博客:策略模式+单例模式+简单工厂模式:推送服务 ,想试用一下工厂模式:将之前的简单工厂模式格式化为工厂模式。

    二、实现

    修改前:简单工厂

     public static class PushServiceFactory
        {
            public static IPush Creat(PushType type)
            {
                IPush pushService = null;
                switch (type)
                {
                    case PushType.QQ: pushService = QQ.GetInstance(); break;
                    case PushType.Email: pushService = new Email(); break;
                    default:throw new ArgumentOutOfRangeException();
                }
                return pushService;
            }
        }
     public void ExcutePush(object data, List<PushType> types)
            {
                Console.WriteLine("推送数据");
                foreach (PushType type in types)
                {
                    IPush pushService = PushServiceFactory.Creat(type);
                    pushService.Push(data);
                }
            }

    修改后:工厂模式(象征性的都写在一个文件里面)

     interface Factory
        {
            IPush Creat();
        }
    
        public class QQFactory : Factory
        {
            public IPush Creat()
            {
                return QQ.GetInstance();
            }
        }
        public class EmailFactory : Factory
        {
            public IPush Creat()
            {
                return new Email();
            }
    
        }
      interface Factory
        {
            IPush Creat();
        }
    
        public class QQFactory:Factory
        {
           public IPush Creat()
            {
                return QQ.GetInstance();
            }
        }
        public class EmailFactory : Factory
        {
            public IPush Creat()
            {
                return new Email();
            }
    
        }

    3、调用(这里有个前提:我不知道客户端是勾选了QQ推送还是Email推送)

    所以在这里的调用,又回到了简单工厂模式,用简单工厂模式通过传参数,选择启用的推送工厂,进而实例具体的推送。

    所以我觉得,简单工厂虽然有强耦合,但是我可以在不知道客户端需要调用谁的情况下,根据参数来实例化具体的类。

    工厂模式,是我知道客户端明确的调用那个工厂来创建。

    之前:简单工厂的调用

     public void ExcutePush(object data, List<PushType> types)
            {
                Console.WriteLine("推送数据");
                foreach (PushType type in types)
                {
                    IPush pushService = PushServiceFactory.Creat(type);
                    pushService.Push(data);
                }
            }

    现在:工厂模式调用

     public void ExcutePush(object data, List<PushType> types)
            {
                Console.WriteLine("推送数据");
                foreach (PushType type in types)
                {
                    Factory factory = null;
                    switch (type)
                    {
                        case PushType.QQ: factory = new QQFactory(); break;
                        case PushType.Email: factory = new EmailFactory(); break;
                        default: throw new ArgumentOutOfRangeException();
                    }
                    IPush pushService = factory.Creat();
                    pushService.Push(data);
                }
            }

    4、总结

    合适的才是最好的。

  • 相关阅读:
    USACO 5.4.2 tour
    USACO 4.4.2 milk6
    USACO 6.1.2 rectbarn
    USACO 4.1.4 cryptcow
    VC++学习笔记之ActiveX
    VC++学习笔记之MFC应用程序创建/执行顺序和MFC运行机制
    FusionCharts Free(一)使用方法和应用实例(asp.net)
    FusionCharts Free(二)使用方法详细解析
    VC++学习笔记之MFC消息映射机制
    MFC基本知识沉淀
  • 原文地址:https://www.cnblogs.com/sunchong/p/5052897.html
Copyright © 2011-2022 走看看