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

Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式

 更新時間:2016年01月31日 08:58:12   投稿:goldensun  
這篇文章主要介紹了Java設(shè)計模式編程中的工廠方法模式和抽象工廠模式,設(shè)計模式的建立有利于團(tuán)隊協(xié)作時代碼的共同維護(hù),需要的朋友可以參考下

工廠方法模式

動機(jī)
創(chuàng)建一個對象往往需要復(fù)雜的過程,所以不適合包含在一個復(fù)合工廠中,當(dāng)有新的產(chǎn)品時,需要修改這個復(fù)合的工廠,不利于擴(kuò)展。

而且,有些對象的創(chuàng)建可以需要用到復(fù)合工廠訪問不到的信息,所以,定義一個工廠接口,通過實現(xiàn)這個接口來決定實例化那個產(chǎn)品,這就是工廠方法模式,讓類的實例化推遲到子類中進(jìn)行。

目的
1. 定義一個接口,讓子類決定實例化哪個產(chǎn)品。
2. 通過通用接口創(chuàng)建對象。

實現(xiàn)

201613185626410.gif (582×294)

1. 產(chǎn)品接口和具體產(chǎn)品很好理解。
2. 工廠類提供一個工廠方法,返回一個產(chǎn)品對象。但是這個工廠方法是抽象的。
3. 具體工廠類實現(xiàn)工廠方法,完成具體產(chǎn)品的創(chuàng)建。

//幾個Button類 
class Button{/* ...*/} 
class WinButton extends Button{/* ...*/} 
class MacButton extends Button{/* ...*/} 
  
//它們的工廠類 
interface ButtonFactory{ 
  abstract Button createButton(); 
} 
class WinButtonFactory implements ButtonFactory{ 
  Button createButton(){ 
    return new WinButton(); 
  } 
} 
class MacButtonFactory implements ButtonFactory{ 
  Button createButton(){ 
    return new MacButton(); 
  } 
} 

適用場景
1. 創(chuàng)建對象時有比較多重復(fù)的代碼時,可以考慮使用工廠方法模式執(zhí)行這些重復(fù)的部分。
2. 創(chuàng)建對象需要訪問某些信息,而這些信息不應(yīng)該包含在工廠類,那么可以讓子類來實現(xiàn)對象的創(chuàng)建。
3. 需要集中管理對象的創(chuàng)建,保持程序的一致性時。


抽象工廠模式
定義
抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨(dú)的工廠封裝起來。在正常使用中,客戶端程序需要創(chuàng)建抽象工廠的具體實現(xiàn),然后使用抽象工廠作為接口來創(chuàng)建這一主題的具體對象??蛻舳顺绦虿恍枰溃ɑ蜿P(guān)心)它從這些內(nèi)部的工廠方法中獲得對象的具體類型,因為客戶端程序僅使用這些對象的通用接口。抽象工廠模式將一組對象的實現(xiàn)細(xì)節(jié)與他們的一般使用分離開來。

“工廠”是創(chuàng)建產(chǎn)品(對象)的地方,其目的是將產(chǎn)品的創(chuàng)建與產(chǎn)品的使用分離。抽象工廠模式的目的,是將若干抽象產(chǎn)品的接口與不同主題產(chǎn)品的具體實現(xiàn)分離開。這樣就能在增加新的具體工廠的時候,不用修改引用抽象工廠的客戶端代碼。

使用抽象工廠模式,能夠在具體工廠變化的時候,不用修改使用工廠的客戶端代碼,甚至是在運(yùn)行時。然而,使用這種模式或者相似的設(shè)計模式,可能給編寫代碼帶來不必要的復(fù)雜性和額外的工作。正確使用設(shè)計模式能夠抵消這樣的“額外工作”。

實現(xiàn)

201613185704335.png (820×411)

1. AbstractFactory - 定義創(chuàng)建抽象產(chǎn)品的接口方法。
2. ConcreteFactory - 實現(xiàn)方法創(chuàng)建具體的產(chǎn)品。
3. AbstractProduct - 聲明不同類型的產(chǎn)品的接口。
4. Product - 定義ConcreteFactory對應(yīng)的具體產(chǎn)品,實現(xiàn)AbstractProduct接口。
5. Client - 使用AbstractFactory和AbstractProduct類。

abstract class AbstractProductA{ 
  public abstract void operationA1(); 
  public abstract void operationA2(); 
} 
 
class ProductA1 extends AbstractProductA{ 
  ProductA1(String arg){ 
    System.out.println("Hello "+arg); 
  } // Implement the code here 
  public void operationA1() { }; 
  public void operationA2() { }; 
} 
 
class ProductA2 extends AbstractProductA{ 
  ProductA2(String arg){ 
    System.out.println("Hello "+arg); 
  } // Implement the code here 
  public void operationA1() { }; 
  public void operationA2() { }; 
} 
 
abstract class AbstractProductB{ 
  //public abstract void operationB1(); 
  //public abstract void operationB2(); 
} 
 
class ProductB1 extends AbstractProductB{ 
  ProductB1(String arg){ 
    System.out.println("Hello "+arg); 
  } // Implement the code here 
} 
 
class ProductB2 extends AbstractProductB{ 
  ProductB2(String arg){ 
    System.out.println("Hello "+arg); 
  } // Implement the code here 
} 
 
abstract class AbstractFactory{ 
  abstract AbstractProductA createProductA(); 
  abstract AbstractProductB createProductB(); 
} 
 
class ConcreteFactory1 extends AbstractFactory{ 
  AbstractProductA createProductA(){ 
    return new ProductA1("ProductA1"); 
  } 
  AbstractProductB createProductB(){ 
    return new ProductB1("ProductB1"); 
  } 
} 
 
class ConcreteFactory2 extends AbstractFactory{ 
  AbstractProductA createProductA(){ 
    return new ProductA2("ProductA2"); 
  } 
  AbstractProductB createProductB(){ 
    return new ProductB2("ProductB2"); 
  } 
} 
 
//Factory creator - an indirect way of instantiating the factories 
class FactoryMaker{ 
  private static AbstractFactory pf=null; 
  static AbstractFactory getFactory(String choice){ 
    if(choice.equals("a")){ 
      pf=new ConcreteFactory1(); 
    }else if(choice.equals("b")){ 
            pf=new ConcreteFactory2(); 
        } 
        return pf; 
  } 
} 
 
// Client 
public class Client{ 
  public static void main(String args[]){ 
    AbstractFactory pf=FactoryMaker.getFactory("a"); 
    AbstractProductA product=pf.createProductA(); 
    //more function calls on product 
  } 
} 

FactoryMaker類使用的是簡單工廠模式,而具體工廠的實現(xiàn)用的是工廠方法模式。

適用場景
1. 一個系統(tǒng)要獨(dú)立于它的產(chǎn)品的創(chuàng)建、組合和表示時。
2. 一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。
3. 需要強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對象的設(shè)計以便進(jìn)行聯(lián)合使用時。
4. 提供一個產(chǎn)品類庫,而只想顯示它們的接口而不是實現(xiàn)時。

優(yōu)點(diǎn)
1. 具體產(chǎn)品從客戶代碼中被分離出來
2. 容易改變產(chǎn)品的系列
3. 將一個系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建

缺點(diǎn)
1. 在產(chǎn)品族中擴(kuò)展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口和具體工廠。

相關(guān)文章

  • 基于@LastModifiedDate不起作用的解決方案

    基于@LastModifiedDate不起作用的解決方案

    這篇文章主要介紹了基于@LastModifiedDate不起作用的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 手把手教你使用Java實現(xiàn)在線生成pdf文檔

    手把手教你使用Java實現(xiàn)在線生成pdf文檔

    在實際的業(yè)務(wù)開發(fā)的時候,常常會需要把相關(guān)的數(shù)據(jù)信息,通過一些技術(shù)手段生成對應(yīng)的PDF文件,然后返回給用戶。本文將手把手教大家如何利用Java實現(xiàn)在線生成pdf文檔,需要的可以參考一下
    2022-03-03
  • 聊聊Java 中的線程中斷

    聊聊Java 中的線程中斷

    這篇文章主要介紹了Java 中的線程中斷的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-11-11
  • Servlet會話技術(shù)基礎(chǔ)解析

    Servlet會話技術(shù)基礎(chǔ)解析

    這篇文章主要介紹了Servlet會話技術(shù)基礎(chǔ)解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • JAVA mongodb 聚合幾種查詢方式詳解

    JAVA mongodb 聚合幾種查詢方式詳解

    這篇文章主要介紹了JAVA mongodb 聚合幾種查詢方式詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java封裝統(tǒng)一的Result Model案例

    Java封裝統(tǒng)一的Result Model案例

    這篇文章主要介紹了Java封裝統(tǒng)一的Result Model案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java基礎(chǔ)之教你如何正確運(yùn)用依賴注入

    Java基礎(chǔ)之教你如何正確運(yùn)用依賴注入

    最近發(fā)現(xiàn)很多使用Spring框架的Java代碼存在依賴注入方式的誤用,甚至是濫用.因此整理了這篇文章,歡迎大家一起探討,需要的朋友可以參考下
    2021-05-05
  • 簡單談?wù)凧ava中的棧和堆

    簡單談?wù)凧ava中的棧和堆

    堆和棧都是Java用來在RAM中存放數(shù)據(jù)的地方,下面這篇文章主要給大家介紹了關(guān)于Java中棧和堆的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • Springboot單體架構(gòu)http請求轉(zhuǎn)換https請求來支持微信小程序調(diào)用接口

    Springboot單體架構(gòu)http請求轉(zhuǎn)換https請求來支持微信小程序調(diào)用接口

    這篇文章主要介紹了Springboot單體架構(gòu)http請求轉(zhuǎn)換https請求來支持微信小程序調(diào)用接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • SpringMVC使用MultipartResolver實現(xiàn)文件上傳

    SpringMVC使用MultipartResolver實現(xiàn)文件上傳

    MultipartResolver 用于處理文件上傳,當(dāng)收到請求時 DispatcherServlet 的 checkMultipart() 方法會調(diào)用 MultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件
    2023-02-02

最新評論

克什克腾旗| 平乡县| 通河县| 错那县| 津市市| 淅川县| 嘉善县| 凤翔县| 大冶市| 乌拉特后旗| 桑日县| 蒙山县| 襄垣县| 奉贤区| 修武县| 犍为县| 翁牛特旗| 西充县| 德令哈市| 鄱阳县| 塔城市| 密云县| 嘉鱼县| 松溪县| 抚顺县| 乐亭县| 萨嘎县| 随州市| 博白县| 呼伦贝尔市| 原阳县| 香港| 大埔县| 新野县| 介休市| 博客| 治县。| 平谷区| 新乡县| 九龙县| 东丽区|