首頁  >  文章  >  Java  >  java 三種工廠模式的快速,簡易理解

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

高洛峰
高洛峰原創
2016-12-15 14:31:451028瀏覽

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