最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計模式——工廠設(shè)計模式詳解

 更新時間:2017年11月07日 14:11:37   作者:ip-10000  
這篇文章主要介紹了Java設(shè)計模式——工廠設(shè)計模式詳解,具有一定參考價值,需要的朋友可以了解下。

工廠模式:主要用來實例化有共同接口的類,工廠模式可以動態(tài)決定應(yīng)該實例化那一個類。

工廠模式的形態(tài)

工廠模式主要用一下幾種形態(tài):

1:簡單工廠(Simple Factory)。
2:工廠方法(Factory Method)。
3:抽象工廠(Abstract Factory)。

簡單工廠(Simple Factory)

又叫靜態(tài)工廠,是工廠模式三中狀態(tài)中結(jié)構(gòu)最為簡單的。主要有一個靜態(tài)方法,用來接受參數(shù),并根據(jù)參數(shù)來決定返回實現(xiàn)同一接口的不同類的實例。我們來看一個具體的例子:
假設(shè)一家工廠,幾生產(chǎn)洗衣機,有生產(chǎn)冰箱,還有空調(diào)等等..
我們先為所有產(chǎn)品定義一個共同的產(chǎn)品接口

public interface Product{} 

接著我們讓這個工廠的所有產(chǎn)品都必須實現(xiàn)此接口

public class Washer implements Product{ 
  public Washer(){ 
    System.out.println("洗衣機被制造了"); 
  } 
} 
 
public class Icebox implements Product{ 
  public Icebox(){ 
    System.out.println("冰箱被制造了"); 
  } 
} 
 
public class AirCondition implements Product{ 
  public Icebox(){ 
    System.out.println("空調(diào)被制造了"); 
  } 
} 

接下來我們來寫一個工廠類,有它來負責(zé)生產(chǎn)以上的產(chǎn)品

public class SimpleFactory { 
   
  public static Product factory(String productName) throws Exception{ 
    if(productName.equals("Washer")){ 
      return new Washer(); 
    }else if(productName.equals("Icebox")){ 
      return new Icebox(); 
    }else if(productName.equals("AirCondition")){ 
      return new AirCondition(); 
    }else{ 
      throw new Exception("沒有該產(chǎn)品"); 
    } 
  } 
} 

好了,有了這個工廠類,我們就可以開始下定單了,SimpleFactory將根據(jù)不同的定單類決定生產(chǎn)什么產(chǎn)品。

public static void main(String[] args) { 
  try { 
       SimpleFactory.factory("Washer"); 
       SimpleFactory.factory("Icebox"); 
       SimpleFactory.factory("AirCondition"); 
      } catch (Exception e) { 
    e.printStackTrace(); 
  } 
} 

由上面的代碼可以看出,簡單工廠的核心就是一個SimpleFactory類,他擁有必要的邏輯判斷能力和所有產(chǎn)品的創(chuàng)建權(quán)利,我們只需要向把定單給他,就能得到我們想要的產(chǎn)品。這使用起來似乎非常方便。

但,實際上,這個SimpleFactory有很多的局限。首先,我們每次想要增加一種新產(chǎn)品的時候,都必須修改SimpleFactory的原代碼。其次,當(dāng)我們擁有很多很多產(chǎn)品的時候,而且產(chǎn)品之間又存在復(fù)雜的層次關(guān)系的時候,這個類必須擁有復(fù)雜的邏輯判斷能力,其代碼量也將不斷地激增,這對以后的維護簡直就是恐怖兩個字...

還有就是,整個系統(tǒng)都嚴重依賴SimpleFactory類,只要SimpleFactory類一出問題,系統(tǒng)就進入不能工作的狀態(tài),這也是最為致命的一點....

以上的不足將在工廠模式的另外兩種狀態(tài)中得到解決。

工廠方法(Factory Method)

上面的代碼告訴我們,簡單工廠并不簡單,它是整個模式的核心,一旦他出了問題,整個模式都將受影響而不能工作,為了降低風(fēng)險和為日后的維護、擴展做準(zhǔn)備,我們需要對它進行重構(gòu),引入工廠方法。

工廠方法為工廠類定義了接口,用多態(tài)來削弱了工廠類的職能,以下是工廠接口的定義:

public interface Factory{ 
 public Product create(); 
} 

我們再來定義一個產(chǎn)品接口

public interface Product{} 

一下是實現(xiàn)了產(chǎn)品接口的產(chǎn)品類

public class Washer implements Product{ 
  public Washer(){ 
    System.out.println("洗衣機被制造了"); 
  } 
} 
 
public class Icebox implements Product{ 
  public Icebox(){ 
    System.out.println("冰箱被制造了"); 
  } 
} 
 
public class AirCondition implements Product{ 
  public Icebox(){ 
    System.out.println("空調(diào)被制造了"); 
  } 
} 

接下來,就是工廠方法的核心部分,也就是具體創(chuàng)建產(chǎn)品對象的具體工廠類,

//創(chuàng)建洗衣機的工廠 
public class CreateWasher implements Factory{ 
  public Product create(){ 
     return new Washer(); 
  } 
} 
 
//創(chuàng)建冰箱的工廠 
public class CreateIcebox implements Factory{ 
  public Product create(){ 
     return new Icebox(); 
  } 
} 
 
//創(chuàng)建空調(diào)的工廠 
public class CreateAirCondition implements Factory{ 
  public Product create(){ 
     return new AirCondition(); 
  } 
} 

從上面創(chuàng)建產(chǎn)品對象的代碼可以看出,工廠方法和簡單工廠的主要區(qū)別是,簡單工廠是把創(chuàng)建產(chǎn)品的職能都放在一個類里面,而工廠方法則把不同的產(chǎn)品放在實現(xiàn)了工廠接口的不同工廠類里面,這樣就算其中一個工廠類出了問題,其他工廠類也能正常工作,互相不受影響,以后增加新產(chǎn)品,也只需要新增一個實現(xiàn)工廠接口工廠類,就能達到,不用修改已有的代碼。但工廠方法也有他局限的地方,那就是當(dāng)面對的產(chǎn)品有復(fù)雜的等級結(jié)構(gòu)的時候,例如,工廠除了生產(chǎn)家電外產(chǎn)品,還生產(chǎn)手機產(chǎn)品,這樣一來家電是手機就是兩大產(chǎn)品家族了,這兩大家族下面包含了數(shù)量眾多的產(chǎn)品,每個產(chǎn)品又有多個型號,這樣就形成了一個復(fù)雜的產(chǎn)品樹了。如果用工廠方法來設(shè)計這個產(chǎn)品家族系統(tǒng),就必須為每個型號的產(chǎn)品創(chuàng)建一個對應(yīng)的工廠類,當(dāng)有數(shù)百種甚至上千種產(chǎn)品的時候,也必須要有對應(yīng)的上百成千個工廠類,這就出現(xiàn)了傳說的類爆炸,對于以后的維護來說,簡直就是一場災(zāi)難.....

抽象工廠(Factory Method)

抽象工廠:意的意圖在于創(chuàng)建一系列互相關(guān)聯(lián)或互相依賴的對象。<<Java設(shè)計模式>>

我自己覺得抽象工廠是在工廠方法的基礎(chǔ)上引進了分類管理的概念....

工廠方法用來創(chuàng)建一個產(chǎn)品,它沒有分類的概念,而抽象工廠則用于創(chuàng)建一系列產(chǎn)品,所以產(chǎn)品分類成了抽象工廠的重點,
我們繼續(xù)用上面的例子來說明:

工廠生產(chǎn)的所有產(chǎn)品都用都用大寫字母來標(biāo)明它們的型號,比如冰箱,就有“冰箱-A",“冰箱-B",同樣,其他的產(chǎn)品也都是遵守這個編號規(guī)則,于是就有了一下產(chǎn)品家族樹

冰箱:

冰箱-A
冰箱-B

洗衣機:

洗衣機-A
洗衣機-B

我們可以為冰箱和洗衣機分別定義兩個產(chǎn)品接口,以對他們進行分類

//洗衣機接口 
public interface Washer{ 
} 
 
//冰箱接口 
public interface Icebox{ 
} 

接著,我們分別創(chuàng)建這兩個接口的具體產(chǎn)品

//洗衣機-A 
public class WasherA implements Washer{ 
  public WasherA(){ 
    System.out.println("洗衣機-A被制造了"); 
  } 
} 
//洗衣機-B 
public class WasherB implements Washer{ 
  public WasherB(){ 
    System.out.println("洗衣機-B被制造了"); 
  } 
} 
//冰箱-A 
public class IceboxA implements Icebox{ 
  public IceboxA(){ 
    System.out.println("冰箱-A被制造了"); 
  } 
} 
//冰箱-B 
public class IceboxB implements Icebox{ 
  public IceboxB(){ 
    System.out.println("冰箱-B被制造了"); 
  } 
} 

到此,產(chǎn)品部分我們準(zhǔn)備好了,接下來我們來處理工廠部分,我們先來定義工廠行為接口

public interface Factory{ 
    public Washer createWasher(); 
    public Icebox createIcebox(); 
} 

接下來我創(chuàng)造具體的工廠類,我們根據(jù)上面產(chǎn)品的接口,把型號A的產(chǎn)品分為一類,由一個工廠來管理,把型號為B的產(chǎn)品有另一個工廠管理,根據(jù)這個分類,我們可以實現(xiàn)如下的兩個具體工廠類

//創(chuàng)建型號為A的產(chǎn)品工廠 
public class FactoryA implements Factory{ 
    //創(chuàng)建洗衣機-A 
    public Washer createWasher(){ 
      return new WasherA(); 
    } 
    //創(chuàng)建冰箱-A 
    public Icebox createIcebox(){ 
      return new IceboxA(); 
    } 
} 
//創(chuàng)建型號為B的產(chǎn)品工廠 
public class FactoryB implements Factory{ 
    //創(chuàng)建洗衣機-B 
    public Washer createWasher(){ 
      return new WasherB(); 
    } 
    //創(chuàng)建冰箱-B 
    public Icebox createIcebox(){ 
      return new IceboxB(); 
    } 
} 

這樣,我們的抽象工廠就完成了。有上面可以看出,在運用上我覺得工廠方法和抽象工廠,都有自己的應(yīng)用場景,并沒有什么優(yōu)劣之分,但在應(yīng)用抽象工廠之前,要先對創(chuàng)建的對象進行系統(tǒng)的分類,這點很重要,好的產(chǎn)品分類規(guī)則能為具體工廠類的選擇調(diào)用和以后的擴展提供清晰的思路.

總結(jié)

以上就是本文關(guān)于Java設(shè)計模式——工廠設(shè)計模式詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Java設(shè)計模式之訪問者模式使用場景及代碼示例、Java設(shè)計模式筆記之抽象工廠代碼示例等,有什么問題可以隨時留言,小編會及時回復(fù)大家的。感謝朋友們對本站的支持!

相關(guān)文章

  • Spring MVC+mybatis實現(xiàn)注冊登錄功能

    Spring MVC+mybatis實現(xiàn)注冊登錄功能

    這篇文章主要為大家詳細介紹了Spring MVC+mybatis實現(xiàn)注冊登錄功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Spring 開發(fā)之組件賦值的實現(xiàn)方法

    Spring 開發(fā)之組件賦值的實現(xiàn)方法

    這篇文章主要介紹了Spring 開發(fā)之組件賦值的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java 方法遞歸的思路詳解

    Java 方法遞歸的思路詳解

    程序調(diào)用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計語言中廣泛應(yīng)用。但是如果沒終止條件會造成死循環(huán),所以遞歸代碼里要有結(jié)束自調(diào)自的條件,接下來講解一下學(xué)習(xí)遞歸的思路
    2022-04-04
  • java實現(xiàn)圖片裁切的工具類實例

    java實現(xiàn)圖片裁切的工具類實例

    這篇文章主要介紹了java實現(xiàn)圖片裁切的工具類實例,涉及Java針對圖片的讀取、修改等相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • mybatis-plus IdWorker生成的Id和返回給前臺的不一致的解決

    mybatis-plus IdWorker生成的Id和返回給前臺的不一致的解決

    這篇文章主要介紹了mybatis-plus IdWorker生成的Id和返回給前臺的不一致的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Spring?Aop+Redis實現(xiàn)優(yōu)雅記錄接口調(diào)用情況

    Spring?Aop+Redis實現(xiàn)優(yōu)雅記錄接口調(diào)用情況

    通常情況下,開發(fā)完一個接口,無論是在測試階段還是生產(chǎn)上線,我們都需要對接口的執(zhí)行情況做一個監(jiān)控,所以本文為大家整理了Spring統(tǒng)計接口調(diào)用的多種方法,希望對大家有所幫助
    2023-06-06
  • 解決mybatis使用foreach批量insert異常的問題

    解決mybatis使用foreach批量insert異常的問題

    這篇文章主要介紹了解決mybatis使用foreach批量insert異常的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java四舍五入時保留指定小數(shù)位數(shù)的五種方式

    Java四舍五入時保留指定小數(shù)位數(shù)的五種方式

    這篇文章主要介紹了Java四舍五入時保留指定小數(shù)位數(shù)的五種方式,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • Kotlin基礎(chǔ)教程之控制流(順序,分支,循環(huán))

    Kotlin基礎(chǔ)教程之控制流(順序,分支,循環(huán))

    這篇文章主要介紹了Kotlin基礎(chǔ)教程之控制流的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • SpringCloud Feign 服務(wù)調(diào)用的實現(xiàn)

    SpringCloud Feign 服務(wù)調(diào)用的實現(xiàn)

    Feign是一個聲明性web服務(wù)客戶端。本文記錄多個服務(wù)之間使用Feign調(diào)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01

最新評論

娱乐| 开化县| 泸西县| 习水县| 翼城县| 满洲里市| 江油市| 抚顺县| 黑河市| 三门县| 巴林左旗| 教育| 丰镇市| 盐城市| 鸡东县| 错那县| 泾阳县| 新余市| 诸暨市| 吉林省| 天全县| 巴彦县| 桂平市| 雷州市| 广灵县| 夏邑县| 绍兴市| 沙坪坝区| 玉溪市| 进贤县| 壤塘县| 怀仁县| 娄底市| 武平县| 德江县| 海安县| 石棉县| 宜君县| 鹿邑县| 西城区| 上思县|