tft每日頭條

 > 生活

 > 24種設計模式講解

24種設計模式講解

生活 更新时间:2024-08-07 07:28:32

現實生活中,原始社會自給自足(沒有工廠),農耕社會小作坊(簡單工廠,民間酒坊),工業革命流水線(工廠方法,自産自銷),現代産業鍊代工廠(抽象工廠,富士康)。我們的項目代碼同樣是由簡到繁一步一步疊代而來的,但對于調用者來說,卻越來越簡單。

在日常開發中,凡是需要生成複雜對象的地方,都可以嘗試考慮使用工廠模式來代替。

注意:上述複雜對象指的是類的構造函數參數過多等對類的構造有影響的情況,因為類的構造過于複雜,如果直接在其他業務類内使用,則兩者的耦合過重,後續業務更改,就需要在任何引用該類的源代碼内進行更改,光是查找所有依賴就很消耗時間了,更别說要一個一個修改了。

工廠模式的定義:定義一個創建産品對象的工廠接口,将産品對象的實際創建工作推遲到具體子工廠類當中。這滿足創建型模式中所要求的“創建與使用相分離”的特點。

按實際業務場景劃分,工廠模式有 3 種不同的實現方式,分别是簡單工廠模式、工廠方法模式和抽象工廠模式。

我們把被創建的對象稱為“産品”,把創建産品的對象稱為“工廠”。如果要創建的産品不多,隻要一個工廠類就可以完成,這種模式叫“簡單工廠模式”。

在簡單工廠模式中創建實例的方法通常為靜态(static)方法,因此簡單工廠模式(Simple Factory Pattern)又叫作靜态工廠方法模式(Static Factory Method Pattern)。

簡單來說,簡單工廠模式有一個具體的工廠類,可以生成多個不同的産品,屬于創建型設計模式。簡單工廠模式不在 GoF 23 種設計模式之列。

簡單工廠模式每增加一個産品就要增加一個具體産品類和一個對應的具體工廠類,這增加了系統的複雜度,違背了“開閉原則”。

“工廠方法模式”是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的産品,即滿足開閉原則。

優點和缺點優點:
  1. 工廠類包含必要的邏輯判斷,可以決定在什麼時候創建哪一個産品的實例。客戶端可以免除直接創建産品對象的職責,很方便的創建出相應的産品。工廠和産品的職責區分明确。
  2. 客戶端無需知道所創建具體産品的類名,隻需知道參數即可。
  3. 也可以引入配置文件,在不修改客戶端代碼的情況下更換和添加新的具體産品類。
缺點:
  1. 簡單工廠模式的工廠類單一,負責所有産品的創建,職責過重,一旦異常,整個系統将受影響。且工廠類代碼會非常臃腫,違背高聚合原則。
  2. 使用簡單工廠模式會增加系統中類的個數(引入新的工廠類),增加系統的複雜度和理解難度
  3. 系統擴展困難,一旦增加新産品不得不修改工廠邏輯,在産品類型較多時,可能造成邏輯過于複雜
  4. 簡單工廠模式使用了 static 工廠方法,造成工廠角色無法形成基于繼承的等級結構。
應用場景

對于産品種類相對較少的情況,考慮使用簡單工廠模式。使用簡單工廠模式的客戶端隻需要傳入工廠類的參數,不需要關心如何創建對象的邏輯,可以很方便地創建所需産品。

模式的結構與實現

簡單工廠模式的主要角色如下:

  • 簡單工廠(SimpleFactory):是簡單工廠模式的核心,負責實現創建所有實例的内部邏輯。工廠類的創建産品類的方法可以被外界直接調用,創建所需的産品對象。
  • 抽象産品(Product):是簡單工廠創建的所有對象的父類,負責描述所有實例共有的公共接口。
  • 具體産品(ConcreteProduct):是簡單工廠模式的創建目标。

其結構圖如下圖所示。

24種設計模式講解(設計模式簡單工廠模式)1

圖 1 簡單工廠模式的結構圖

根據上圖寫出該模式的代碼如下:

public class Client { public static void main(String[] args) { } //抽象産品 public interface Product { void show(); } //具體産品:ProductA static class ConcreteProduct1 implements Product { public void show() { System.out.println("具體産品1顯示..."); } } //具體産品:ProductB static class ConcreteProduct2 implements Product { public void show() { System.out.println("具體産品2顯示..."); } } final class Const { static final int PRODUCT_A = 0; static final int PRODUCT_B = 1; static final int PRODUCT_C = 2; } static class SimpleFactory { public static Product makeProduct(int kind) { switch (kind) { case Const.PRODUCT_A: return new ConcreteProduct1(); case Const.PRODUCT_B: return new ConcreteProduct2(); } return null; } } }

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved