搜尋
首頁Javajava教程Java中關於工廠方法模式的具體分析

Java中關於工廠方法模式的具體分析

Aug 07, 2017 am 10:26 AM
java方法模式

這篇文章主要介紹了工廠方法模式_動力節點Java學院整理的相關資料,需要的朋友可以參考下

##:定義一個用於創建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類的實例化延遲到其子類。

類型:建立類別模式

#類別圖

工廠方法模式代碼


interface IProduct { 
  public void productMethod(); 
} 
class Product implements IProduct { 
  public void productMethod() { 
    System.out.println("产品"); 
  } 
} 

interface IFactory { 
  public IProduct createProduct(); 
} 
 
class Factory implements IFactory { 
  public IProduct createProduct() { 
    return new Product(); 
  } 
} 

public class Client { 
  public static void main(String[] args) { 
    IFactory factory = new Factory(); 
    IProduct prodect = factory.createProduct(); 
    prodect.productMethod(); 
  } 
}

工廠模式:

首先需要說一下工廠模式。工廠模式依抽象程度的不同分為三種:簡單工廠模式(也叫靜態工廠模式)、本文所述的工廠方法模式、以及抽象工廠模式。工廠模式是程式設計中常用到的模式。它的主要優點有:

  • 可以讓程式碼結構清晰,有效地封裝變更。在程式設計中,產品類別的實例化有時是比較複雜和多變的,透過工廠模式,將產品的實例化封裝起來,使得呼叫者根本無需關心產品的實例化過程,只需依賴工廠即可得到自己想要的產品。

  • 對呼叫者屏蔽具體的產品類別。如果使用工廠模式,呼叫者只關心產品的介面就可以了,至於具體的實現,呼叫者根本無需關心。即使變更了具體的實現,對呼叫者來說沒有任何影響。

  • 降低耦合度。產品類的實例化通常來說是很複雜的,它需要依賴很多的類,而這些類對於呼叫者來說根本無需知道,如果使用了工廠方法,我們需要做的只是實例化好產品類,然後交給呼叫者使用。對呼叫者來說,產品所依賴的類別都是透明的。

 工廠方法模式:

#       以工廠方式模式的類別圖可看到,工廠方法模式有四個要素:

  • 工廠介面。工廠介面是工廠方法模式的核心,與呼叫者直接互動用來提供產品。在實際編程中,有時也會使用一個抽象類別來作為與呼叫者互動的接口,其本質上是一樣的。

  • 工廠實作。在程式設計中,工廠實現決定如何實例化產品,是實現擴展的途徑,需要有多少種產品,就需要有多少個具體的工廠實現。

  • 產品介面。產品介面的主要目的是定義產品的規範,所有的產品實作都必須遵循產品介面定義的規範。產品介面是呼叫者最關心的,產品介面定義的優劣直接決定了呼叫者程式碼的穩定性。同樣,產品介面也可以用抽象類別來代替,但要注意最好不要違反里氏替換原則。

  • 產品實作。實現產品介面的具體類別,決定了產品在客戶端中的具體行為。

        前文提到的簡單工廠模式跟工廠方法模式極為相似,差異是:簡單工廠只有三個要素,他沒有工廠接口,並且得到產品的方法一般是靜態的。因為沒有工廠接口,所以在工廠實現的擴展性方面稍弱,可以算所工廠方法模式的簡化版,關於簡單工廠模式,在此一筆帶過。

適用場景:

        不管是簡單工廠模式,工廠方法模式還是抽象工廠模式,他們具有類似的特性,所以他們的適用場景也是類似的。

        首先,作為建立類別模式,在任何需要產生複雜物件的地方,都可以使用工廠方法模式。有一點要注意的地方就是複雜對象適合使用工廠模式,而簡單對象,特別是只需要透過new就可以完成創建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。

       其次,工廠模式是典型的解耦模式,迪米特法則在工廠模式中表現的特別明顯。當調用者自己組裝產品需要增加依賴關係時,可以考慮使用工廠模式。將會大幅降低物件之間的耦合度。

       再,由於工廠模式是依賴抽象架構的,因此它把實例化產品的任務交由實現類別完成,擴展性比較好。也就是說,當需要係統有較好的擴展性時,可以考慮工廠模式,不同的產品用不同的實作工廠來組裝。     

典型應用

#

       要说明工厂模式的优点,可能没有比组装汽车更合适的例子了。场景是这样的:汽车由发动机、轮、底盘组成,现在需要组装一辆车交给调用者。假如不使用工厂模式,代码如下:


class Engine { 
  public void getStyle(){ 
    System.out.println("这是汽车的发动机"); 
  } 
} 
class Underpan { 
  public void getStyle(){ 
    System.out.println("这是汽车的底盘"); 
  } 
} 
class Wheel { 
  public void getStyle(){ 
    System.out.println("这是汽车的轮胎"); 
  } 
} 
public class Client { 
  public static void main(String[] args) { 
    Engine engine = new Engine(); 
    Underpan underpan = new Underpan(); 
    Wheel wheel = new Wheel(); 
    ICar car = new Car(underpan, wheel, engine); 
    car.show(); 
  } 
}

        可以看到,调用者为了组装汽车还需要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关的,严重违反了迪米特法则,耦合度太高。并且非常不利于扩展。另外,本例中发动机、底盘和轮胎还是比较具体的,在实际应用中,可能这些产品的组件也都是抽象的,调用者根本不知道怎样组装产品。假如使用工厂方法的话,整个架构就显得清晰了许多。


interface IFactory { 
  public ICar createCar(); 
} 
class Factory implements IFactory { 
  public ICar createCar() { 
    Engine engine = new Engine(); 
    Underpan underpan = new Underpan(); 
    Wheel wheel = new Wheel(); 
    ICar car = new Car(underpan, wheel, engine); 
    return car; 
  } 
} 
public class Client { 
  public static void main(String[] args) { 
    IFactory factory = new Factory(); 
    ICar car = factory.createCar(); 
    car.show(); 
  } 
}

        使用工厂方法后,调用端的耦合度大大降低了。并且对于工厂来说,是可以扩展的,以后如果想组装其他的汽车,只需要再增加一个工厂类的实现就可以。无论是灵活性还是稳定性都得到了极大的提高。

以上是Java中關於工廠方法模式的具體分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
後端新人如何選擇Java項目管理工具:Maven還是IntelliJ?使用IDEA自帶的Maven還是額外下載?後端新人如何選擇Java項目管理工具:Maven還是IntelliJ?使用IDEA自帶的Maven還是額外下載?Apr 19, 2025 pm 06:42 PM

後端新人如何選擇Java項目管理工具?剛開始學習後端開發的新手,往往會在選擇項目管理工具上感到困惑。特�...

Java程序員如何入門音視頻開發?需要學習C  嗎?Java程序員如何入門音視頻開發?需要學習C 嗎?Apr 19, 2025 pm 06:39 PM

Java程序員如何入門音視頻開發?學習資源推薦作為一名Java程序員,如果你正在參與一個視頻項目卻對音視頻技�...

poi-tl繪製雙Y軸折線圖時,為何出現折線數量翻倍?poi-tl繪製雙Y軸折線圖時,為何出現折線數量翻倍?Apr 19, 2025 pm 06:33 PM

poi-tl繪製雙Y軸折線圖時折線數量翻倍的排查在使用poi-tl庫繪製包含兩個Y軸的折線圖時,遇到一個奇怪的問題:�...

在Spring Cloud Alibaba中如何將業務模塊的Entity、Mapper、Service集中到Common模塊?在Spring Cloud Alibaba中如何將業務模塊的Entity、Mapper、Service集中到Common模塊?Apr 19, 2025 pm 06:30 PM

在SpringCloudAlibaba中如何將業務模塊的Entity、Mapper、Service集中到Common模塊?在使用SpringCloud...

Go語言如何實現國密SM4和SM2算法的加解密以及互聯互通?Go語言如何實現國密SM4和SM2算法的加解密以及互聯互通?Apr 19, 2025 pm 06:27 PM

Go語言實現國密SM4和SM2加解密本文將詳細介紹如何使用Go語言實現國密SM4和SM2算法的加解密流程,以滿足與Java應�...

在Python項目中是否需要進行分層?在Python項目中是否需要進行分層?Apr 19, 2025 pm 06:24 PM

在Python項目中是否需要分層?最近我在學習Python時,注意到Django開源項目中,很多都在views函數里編寫了大量的�...

如何使用MapStruct簡化系統對接中的字段映射問題?如何使用MapStruct簡化系統對接中的字段映射問題?Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境