小酌重構系列 17 提取工廠類

2021-09-07 06:31:38 字數 2736 閱讀 5986

在程式中建立物件,並設定物件的屬性,是我們長幹的事兒。當建立物件需要大量的重複**時,**看起來就不那麼優雅了。從類的職責角度出發,業務類既要實現一定的邏輯,還要負責物件的建立,業務類幹的事兒也忒多了點。物件建立也是「一件事」,我們可以將「這件事」從業務**中提取出來,讓專門的類去做「這件事」,這個專門的類一般是「工廠類」,這樣使得業務類和工廠類各司其職,**整潔性得以提高。這就是本文要講的主題——提取工廠類。

某pc廠商生產一系列的膝上型電腦,如果膝上型電腦的各個部件都由pc廠商自己生產提供,沒準第一批膝上型電腦還未生產出來,這家pc廠商就已經倒閉了。因為它需要自己研發設計cpu、顯示卡、記憶體、硬碟等核心硬體,這些硬體都需要不同的團隊來支援,維持並管理好這些團隊是非常耗時耗力的。

我們把「類」看作是這個「pc廠商」,所有硬體都靠pc廠商自己研發,意味著類的職責特別多,職責過多也意味著這個類的穩健性較差。

即使這家pc廠商除了cpu,其他所有零件它都生產好了,它仍然不能生產出一台可以正常執行的pc。

那麼怎麼做會比較合適呢?這個pc廠商找好自己在市場上的定位,樹立起這些筆記本的品牌,準備好售前售後策略,至於cpu、顯示卡、記憶體、硬碟這些核心硬體,聯絡優質的廠家,由他們來供貨。然後,拿著這些廠家提供的硬體,在自己的工廠裡生產組裝膝上型電腦,貼上自己的品牌,最終推向市場。

這樣做的好處是,pc的各個零件不需要自己的團隊來研發,也不需要自己生產,他們負責聯絡合適的**商,由**商生產這些硬體,他們只需專注於品牌設計、pc組裝和市場推廣這些環節,這也使得他們的整體風險降低了。

這個過程中包含三方:client(pc廠商)、factory(硬體廠商)和product(硬體產品),可以用下面的圖來表示。

站在硬體廠商的角度,pc廠商是他們的客戶,硬體廠商為pc廠商提供pc零件。

注意:這個示例中的「專一」是指pc廠商專注於品牌設計、pc組裝和市場推廣。

policecarcontroller類的new()方法包含了建立policecar的所有邏輯

public class policecarcontroller

}public class policecar

public int mileage

}

如果policecar的屬性很多,new()方法將變得非常大,**的可讀性和維護性也會降低。從「類的職責」角度去看,policecarcontroller類擔任了policecar的建立職責,我們應將這項職責提取出來。

重構後policecarcontroller類就很直觀了,new()方法被移除了。

現在它依賴於ipoliceca***ctory介面,policecarcontroller不需要知道policecar的建立細節,policecar的建立邏輯被這個工廠介面隔離開了。

這不僅精簡了policecarcontroller的職責,也降低了policecarcontroller和policecar之間的耦合性。

另外,原本policecar物件的生命週期是由policecarcontroller管理的,重構後則由工廠類來管理的。

由工廠類來集中管理物件的生命週期,可以保證程式具有一致的行為(一致性)。

public class policecarcontroller

public policecarcontroller(ipoliceca***ctory policeca***ctory)

public policecar new(int mileage, bool servicerequired)

}public class policecar

public int mileage

}public inte***ce ipoliceca***ctory

public class policeca***ctory : ipoliceca***ctory

}

注意:閱讀這段**時,請將它看成兩部分。

一部分是ipoliceca***ctory和policeca***ctory,另一部分是policecarcontroller和policecar。

我們所熟知的」工廠模式「有三種,它們也被稱之為「工廠模式家族」,或者「工廠三兄弟」。

本文中用到的就是簡單工廠模式,這三者有很多不同的地方,運用場景也各不相同。

(由於本文不是專門 講設計模式的,所以我在這裡就不過多介紹它們的區別和運用場景了)

****** factory pattern:creates objects without exposing the instantiation logic to the client. refers to the newly created object through a common inte***ce。

簡單工廠模式由3部分組成:客戶、工廠和產品。

用一句話可以概括為:客戶需要的產品應由工廠建立,產品的實現細節不應該暴露給客戶。

使用者使用的iphone手機是由富士康生產的,使用者對應下圖中的client,iphone對應product,富士康則對應factory,使用者無需知道富士康是怎麼生產iphone的。

在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式需要專門定義乙個類(或介面)來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

簡單工廠模式適用的場景如下:

小酌重構系列目錄彙總

關注keepfool

小酌重構系列 12 去除上帝類

神說 要有光 就有了光。聖經 上帝要是會寫程式,他寫的類一定是 上帝類 程式設計師不是上帝,不要妄想成為上帝,但程式設計師可以寫出 上帝類 上帝是唯一的,上帝的光芒照耀人間,上帝是很愛面子的,他知道程式設計師寫了 上帝類 搶了他的風頭,於是他降下神罰要懲戒程式設計師。既然你寫了 上帝類 那麼就將你流...

小酌重構系列 13 移除中間類

我們有時候在應用程式中可能編寫了一些 幽靈 類,幽靈 類也叫中間類。這些中間類可能什麼事兒都沒做,而只是簡單地呼叫了其他的元件。這些中間類沒有發揮實際的作用,它們增加了應用程式的層級 layer 並且增加了應用程式的複雜性。這時,我們應將這樣的中間類刪除,甚至刪除中間類所處的 中間層 這就是本文要講...

小酌重構系列 21 避免雙重否定

在自然語言中,雙重否定表示肯定。但是在程式中,雙重否定會降低 的可讀性,使程式不易理解,容易產生錯覺。人通常是用 正向思維 去理解一件事情的,使用雙重否定的判斷,需要開發者以 逆向思維 的方式去理解它的含義。另外,在寫程式時,符號很容易被疏忽和遺漏,一不小心則會編寫出錯誤的 從而產生bug。所以,在...