簡單工廠模式—>工廠模式

K戰神發表於2015-12-17

一、功能

根據前一篇部落格:策略模式+單例模式+簡單工廠模式:推送服務 ,想試用一下工廠模式:將之前的簡單工廠模式格式化為工廠模式。

二、實現

修改前:簡單工廠

 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、總結

合適的才是最好的。

 

相關文章