<工廠方法>比<簡單工廠>多了啥(區別)

前言:多注重設計。僅當複習討論!


簡單工廠模式

UML圖

  假若有一位愛心人士,想給飢餓的流浪動物餵食。此時愛心人士身帶了狗糧,可是他處處找啊找,最終只找到了貓大人,是否是有點慘兮兮。可是若是有簡單工廠模式,以下圖所示,這位愛心人士找到一家剛剛成立的流浪動物收容所,進去以後只要詢問管理員,狗大人在哪裏,我要去給它獻貢。管理員根據你提出的條件,立馬帶你去參拜。
設計模式

概念

  簡單工廠模式是屬於建立型模式,又叫作靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠對象決定建立出哪種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,能夠理解爲是不一樣工廠模式的一個特殊實現。優化

優勢

  工廠類是整個模式的關鍵。包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該建立哪一個具體類的對象。經過使用工廠類,外界能夠從直接建立具體產品對象的尷尬局面擺脫出來,僅僅須要負責「消費」對象就能夠了。而沒必要管這些對象究竟如何建立及如何組織的.明確了各自的職責和權利,有利於整個軟件體系結構的優化。編碼

缺點

  但因爲工廠類集中了全部實例的建立邏輯,違反了高內聚低耦合原則,將所有建立邏輯集中到了一個工廠類中;它所能建立的類只能是事先考慮到的,若是須要添加新的類,則就須要改變工廠類了。
  當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不一樣條件建立不一樣實例的需求。這種對條件的判斷和對具體產品類型的判斷交錯在一塊兒,很難避免模塊功能的蔓延,對系統的維護和擴展很是不利;
  這些缺點在工廠方法模式中獲得了必定的克服。設計

工廠方法模式

UML圖

  過了3年以後,善良的人愈來愈多,你們把各類流浪動物送到了流浪工廠,並隔三岔五的送食物過來。愛心人士由原來的一位變成了一堆,管理員天天累的要命,終於鼓起勇氣提出了離職。廠長一看,這怎麼行,你走了難道要我堂堂一個廠長去指路嗎。因而狠心決定加大投資,先設計好工廠要怎麼幹才能讓這些愛心人士方便本身餵養,而後依照此規定增長几個小工廠,把流浪動物分類。讓善良的人本身去找工廠,本身去餵養吧。
code

概念

  工廠方法模式(FACTORY METHOD)是一種經常使用的類建立型設計模式,。在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣作的目的是將產品類的實例化操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。它的核心結構有四個角色,分別是抽象工廠;具體工廠;抽象產品;具體產品。對象

客戶端實現方式

IFactory animalFactory = new  貓工廠();
    var animal=animalFactory.FindAnimal();
    animal.eat();

優勢

  1. 在工廠方法模式中,工廠方法用來建立客戶所須要的產品,同時還向客戶隱藏了哪一種具體產品類將被實例化這一細節,用戶只須要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。(好比上面愛心人士只要找打了對的工廠,手裏的食物必定能投出去)
  2. 基於工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它可以使工廠能夠自主肯定建立何種產品對象,而如何建立這個對象的細節則徹底封裝在具體工廠內部。工廠方法模式之因此又被稱爲多態工廠模式,是由於全部的具體工廠類都具備同一抽象父類。
  3. 使用工廠方法模式的另外一個優勢是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其餘的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就能夠了。這樣,系統的可擴展性也就變得很是好,徹底符合「開閉原則」。

缺點

  1. 在添加新產品時,須要編寫新的具體產品類,並且還要提供與之對應的具體工廠類,系統中類的個數將成對增長,在必定程度上增長了系統的複雜度,有更多的類須要編譯和運行,會給系統帶來一些額外的開銷。
  2. 因爲考慮到系統的可擴展性,須要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增長了系統的抽象性和理解難度,且在實現時可能須要用到DOM、反射等技術,增長了系統的實現難度。

對比總結

  通過上面的故事和敘述,其實已經大概瞭解了工廠方法模式比簡單工廠多幹了啥,總結以下:blog

  1. 工廠方法模式徹底符合面向對象設計的核心原則:開放-封閉原則。
  2. 工廠方法模式投入比簡單工廠模式要大,正如故事中,廠長不得不增長投入建新廠。對比咱們編碼也是投入大,可是帶來的可維護性是很是高的,畢竟廠長和管理員都舒服了,愛心人士其實也舒服了。
  3. 工廠方法模式的使用對開發者來講更須要必定的抽象能力,沒有這種能力以前,千萬不要亂用(設計模式也是如此)。

除此以外,工廠家族還有一個 <抽象工廠> ,咱下次再繼續對比 , 未完待續! 接口

部分概念引自《深刻淺出設計模式》開發

相關文章
相關標籤/搜索