首頁 Java java教程 java 三種工廠模式的快速,簡易理解

java 三種工廠模式的快速,簡易理解

Dec 15, 2016 pm 02:31 PM
java工廠模式

java 3種工廠模式的快速,簡易理解
1.簡單工廠模式(Simple Factory)
就是專門負責將大量有共同接口的類實例化,而且不必事先知道每次是要實例化哪一個類的模式。它定義一個用於創建物件的接口,由子類別決定實例化哪一個類別。

  //定義水果介面public interface Fruit { void plantFruit(); void eatFruit(); } //蘋果實作水果介面public class Apple implements Fruit { @Override public void plantFruit() {public class Apple implements Fruit { @Override public void plantFruit() {public class Apple.print(ln()種蘋果。 System.out.println("種橘子。"); } @Override public void eatFruit() { System.out.println("吃橘子。"); } } //水果工廠public class FruitFactory { public static Fruit getFurit( String fruitName) { //簡單工廠模式if (fruitName.equalsIgnoreCase("Apple")) { // 如果是蘋果,則傳回蘋果實例return new Apple(); } else if (fruitName.equalsIgnoreCase("Orange")) { // 如果是橘子,則傳回橘子實例return new Orange(); } else { return null; } } } //測試類別public class Test { public static void main(String[]args){ //呼叫簡單工廠模式FruitFactory.getFurit("Orange").plantFruit(); } } 輸出:種橘子。


總結
A:我要購買蘋果,只需向工廠角色(FruitFactory)請求即可。而工廠角色在接到請求後,會自行判斷創作和提供哪一個產品。
B:但對於工廠角色(FruitFactory )來說,增加新的產品(比如說增加草莓)就是一個痛苦的過程。工廠角色必須知道每一種產品,如何創建它們,以及何時向客戶提供它們。換言之,接納新的產品意味著修改這個工廠。
C:因此這種簡單工廠模式的開放性比較差。




=========================================== ================

2.工廠方法模式(Factory Method)
將物件的建立交由父類別中定義的一個標準方法來完成,而不是其建構函數,究竟應該創建何種物件由具體的子類別負責決定。

  //定義水果介面public interface Fruit { void plantFruit(); void eatFruit(); } //蘋果實作水果介面public class Apple implements Fruit { @Override public void plantFruit() {public class Apple implements Fruit { @Override public void plantFruit() {public class Apple.print(ln()種蘋果。 System.out.println("種橘子。"); } @Override public void eatFruit() { System.out.println("吃橘子。"); } } //水果工廠([b]注意:此工廠聲明為一個接口,具有了良好的擴展性[/b]) public interface FactoryMethod { /*** 工廠方法*/ Fruit getFruit(); //定義獲取水果這一過程} //蘋果對水果工廠的實現public class getApple implements FactoryMethod{ @Override public Fruit getFruit() { // TODO Auto-generated method stub return new Apple(); } } //橘子對水果工廠的實作public class getOrange implements yMethod { @OverFactoryMethody public Fruit getFruit(Fruit) { // TODO Auto-generated method stub return new Orange(); } } //測試類別public class TestFactoryMethod { public static void main(String[] args) { getApple apple = new getApple(); apple.getFruit(). eatFruit(); } } 輸出:吃蘋果。



總結:
A:工廠方法模式和簡單工廠模式在結構上的差異是很明顯的。工廠方法模式的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。工廠方法模式可以允許許多特定工廠類別從抽象工廠類別中將創建行為繼承下來,從而可以成為多個簡單工廠模式的綜合,進而推廣了簡單工廠模式。
B:工廠方法模式退化後可以變得很像簡單工廠模式。設想如果非常確定一個系統只需要一個具體工廠類,那麼就不妨把抽象工廠類合併到具體的工廠類中去。由於反正只有一個具體工廠類,不妨將工廠方法改成為靜態方法,這時候就得到了簡單工廠模式。
C:如果需要加入一個新的水果,那麼只需要加入一個新的水果類別以及它所對應的工廠類別。沒有必要修改客戶端,也沒有必要修改抽象工廠角色或其他現有的具體工廠角色。對於增加新的水果類而言,這個系統完全支持"開-閉"原則。
D:對Factory Method模式而言,它只是針對一種類別(如本例中的水果類Fruit),但如果我們還想買肉,那就不行了,這是就必須要Abstract Factory模式幫忙了。


============================================= ==============

3.抽象工廠模式(Abstract Factory)
抽象工廠模式可以說是簡單工廠模式的擴展,它們主要的區別在於需要創建對象的複雜程度。 
在抽象工廠模式中,抽象產品可能是一個或多個,從而構成一個或多個產品族。 在只有一個產品族的情況下,抽象工廠模
式實際上退化到工廠方法模式。

  //定義水果介面public interface Fruit { void plantFruit(); void eatFruit(); } //蘋果實作水果介面public class Apple implements Fruit { @Override public void plantFruit() {public class Apple implements Fruit { @Override public void plantFruit() {public class Apple.print(ln()種蘋果。 System.out.println("種橘子。"); } @Override public void eatFruit() { System.out.println("吃橘子。"); } } //定義肉的介面public interface Meat { void buyMeat( ); void eatMeat(); } //豬肉實作介面public class BigMeat implements Meat { @Override public void buyMeat() { System.out.println("買豬肉。"); } @Override public void eatMeat() { System System .out.println("吃豬肉。"); } } //牛肉實作介面public class CowMeat implements Meat{ @Override public void buyMeat() { System.out.println("買牛肉。"); } @Override public void eatMeat() { System.out.println("吃牛肉。"); } } //定義消費者的介面public interface UserFactory { /*** 水果工廠方法*/ public Fruit getFruit(Fruit whichFruit); /** * 肉的工廠方法*/ public Meat getMeat(Meat whichMeat); } //實作消費者的介面public class User implements UserFactory { @Override public Fruit getFruit(Fruit whichFruit) { return whichFruit; } @Override public Meat getMeat(Meat whichMeat) { return whichMeat; } } //測試類別public class TestUserFactory { public static void main(String[]args){ Fruit apple=new Apple(); Meat bigMeat=new BigMeat(); //消費者實例User me=new User(); me.getFruit(apple).eatFruit(); me.getMeat(bigMeat).buyMeat(); } } 輸出: 吃蘋果。 買豬肉。



總結:
A:抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品的具體類型的情況下,創建多個產品族中的產品對象。這就是抽象工廠模式的用意。
B:抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。
C:抽象工廠模式與工廠方法模式的最大差異就在於,工廠方法模式針對的是一個產品(Fruit)等級結構;而抽象工廠模式則需要面對多個產品等級結構(Fruit、Meat)。


更多java 三種工廠模式的快速,簡易理解相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

2025年的前4個JavaScript框架:React,Angular,Vue,Svelte 2025年的前4個JavaScript框架:React,Angular,Vue,Svelte Mar 07, 2025 pm 06:09 PM

2025年的前4個JavaScript框架:React,Angular,Vue,Svelte

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存? 如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存? Mar 17, 2025 pm 05:44 PM

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?

Node.js 20:關鍵性能提升和新功能 Node.js 20:關鍵性能提升和新功能 Mar 07, 2025 pm 06:12 PM

Node.js 20:關鍵性能提升和新功能

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Java的類負載機制如何起作用,包括不同的類載荷及其委託模型? Mar 17, 2025 pm 05:35 PM

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?

冰山:數據湖桌的未來 冰山:數據湖桌的未來 Mar 07, 2025 pm 06:31 PM

冰山:數據湖桌的未來

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復 Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復 Mar 07, 2025 pm 05:52 PM

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題已修復

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? 如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射? Mar 17, 2025 pm 05:43 PM

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? 如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案? Mar 17, 2025 pm 05:46 PM

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?

See all articles