Java工廠模式詳解--學(xué)習(xí)筆記

  • 目錄
    • 1.概念
    • 2.角色
    • 3.工廠執(zhí)行的具體流程
      • 簡單工廠模式(靜態(tài)工廠方法)
      • 工廠模式
      • 抽象工廠模式
    • 4.分類
    • 5.總結(jié)
    • 6.學(xué)習(xí)參考

1.概念

??簡單來說工廠模式就是幫助我們創(chuàng)建對象,隱藏了對象創(chuàng)建過程的復(fù)雜度(如類B需要調(diào)用類A,工廠類提供A類的創(chuàng)建接口,B只需要調(diào)用接口傳入相應(yīng)參數(shù)即可)、避免你辛苦的準(zhǔn)備構(gòu)造方法的參數(shù)。說白了--就是工廠提供產(chǎn)品給客戶(按照提供的方式不同分成三類:簡單工廠、工廠、抽象工廠) 具體簡介看下面:

大致流程

工廠模式是我們最常用的實(shí)例化對象模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統(tǒng)可以說是隨處可見。因?yàn)楣S模式就相當(dāng)于創(chuàng)建實(shí)例對象的new,我們經(jīng)常要根據(jù)類Class生成實(shí)例對象,如A a=new A() 工廠模式也是用來創(chuàng)建實(shí)例對象的,所以以后new時(shí)就要多個(gè)心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會(huì)給你系統(tǒng)帶來更大的可擴(kuò)展性和盡量少的修改量 —— 百度百科

2.角色

??工廠模式有以下幾個(gè)角色(結(jié)合下面流程圖理解),產(chǎn)品即需要?jiǎng)?chuàng)建的實(shí)例對象

  • 抽象產(chǎn)品類:所創(chuàng)建產(chǎn)品的父類,給出一個(gè)抽象接口或抽象類,以及一般由具體產(chǎn)品類具體實(shí)現(xiàn)。(多態(tài)的表現(xiàn))--- 如 Animal
  • 具體產(chǎn)品類:抽象產(chǎn)品類的實(shí)現(xiàn)類,為實(shí)現(xiàn)某個(gè)具體產(chǎn)品的對象。 --- 如 Dog
  • 抽象工廠類:工廠提供創(chuàng)建產(chǎn)品的方法、工廠方法模式的核心(簡單工廠模式無此抽象類),與應(yīng)用程序無關(guān)。是具體工廠必須實(shí)現(xiàn)的接口或者必須繼承的父類。
  • 具體工廠類:繼承抽象工廠類,實(shí)現(xiàn)具體業(yè)務(wù)邏輯。

3.工廠執(zhí)行的具體流程

圖解工廠模式和抽象工廠模式流程對比

工廠模式:

工廠模式流程

抽象工廠模式:

抽象工廠模式流程

4.分類

簡單工廠模式(靜態(tài)工廠方法)

沒有抽象工廠類,由工廠類自身提供產(chǎn)品,代碼如下

抽象產(chǎn)品類(抽象類或接口)

public interface IProduct{
    void method();
}

具體產(chǎn)品實(shí)現(xiàn)類

//A產(chǎn)品
public class ProductA implement IProduct{
    void method(){
        logger.info("ProductA");
    }
}

//B產(chǎn)品
public class ProductB implement IProduct{
    void method(){
        logger.info("ProductB");
    }
}

工廠類

public class Factory{
    //簡單工廠模式 只有一個(gè)靜態(tài)方法提供產(chǎn)品所以也叫靜態(tài)工廠方法
    public static IProduct createProduct(String productName){
        if("A".equals("A"){
            return new ProductA();
        }else if("B".equals("B"){
            return new ProductB();
        }else
    }
}
  • 優(yōu)點(diǎn)? 強(qiáng)調(diào)職責(zé)單一原則,一個(gè)類只提供一種功能
  • 缺點(diǎn)? 一旦對工廠類的修改就違反了開封閉原則

工廠模式

工廠模式有一個(gè)抽象工廠類對應(yīng)多個(gè)個(gè)具體工廠實(shí)現(xiàn)類、一個(gè)抽象產(chǎn)品類對應(yīng)一個(gè)具體實(shí)現(xiàn)類、并且每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例

抽象產(chǎn)品類(抽象類或接口)

public interface IProduct{
    void method();
}

具體產(chǎn)品實(shí)現(xiàn)類

//A產(chǎn)品
public class ProductA implement IProduct{
    void method(){
        logger.info("ProductA");
    }
}

//B產(chǎn)品
public class ProductB implement IProduct{
    void method(){
        logger.info("ProductB");
    }
}

抽象工廠類(抽象類或接口)

public abstract class Factory{    
/**  
*抽象工廠方法  
*具體產(chǎn)生什么由子類決定  
*@return 具體產(chǎn)品對象  
*/    
public abstract IProduct createProduct();    
}     

具體工廠類

//A工廠
public class AFactory extends Factory {
    //提供A產(chǎn)品
    public  IProduct createProduct(){
        return new ProductA();
     }
}

//B工廠
public class BFactory extends Factory {
    //提供B產(chǎn)品
    public  IProduct createProduct(){
        return new ProductB();
     }
}

用法

Factory factory = new AFactory();  
IProduct aProduct = factory.createProduct();  
product.method();  
  • 優(yōu)點(diǎn)? 克服了簡單工廠違背開放-封閉原則的缺點(diǎn),又保留了封裝對象創(chuàng)建過程的優(yōu)點(diǎn),降低客戶端和工廠的耦合性,所以說“工廠模式”是“簡單工廠模式”的進(jìn)一步抽象和推廣
  • 缺點(diǎn)?每增加一個(gè)產(chǎn)品,相應(yīng)的也要增加一個(gè)子工廠,加大了額外的開發(fā)量。

抽象工廠模式

工廠模式有一個(gè)抽象工廠類對應(yīng)多個(gè)個(gè)具體工廠實(shí)現(xiàn)類、多個(gè)抽象產(chǎn)品類對應(yīng)多個(gè)具體實(shí)現(xiàn)類、并且每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例。

抽象產(chǎn)品類(抽象類或接口)

//飲料
public interface IDrink{
    void method();
}
//食物
public interface IFood{
    void method();
}

具體產(chǎn)品實(shí)現(xiàn)類

//面條
public class Noddle implement IFood{
    void method(){
        logger.info("面條");
    }
}

//米飯
public class Rice implement IFood{
    void method(){
        logger.info("米飯");
    }
}

//可樂
public class Cola implement IDrink{
    void method(){
        logger.info("可樂");
    }
}

//米飯
public class Sprite implement IDrink{
    void method(){
        logger.info("雪碧");
    }
}

抽象工廠類(抽象類或接口)

public abstract class Factory{    
/**  
*抽象工廠方法  
*具體產(chǎn)生什么由子類決定  
*@return 具體產(chǎn)品對象  
*/    
public abstract IFood createFoodProduct();    
public abstract IDrink createDrinkProduct();    
}     

具體工廠類

//A餐工廠(提供可樂和米飯)
public class AFactory extends Factory{
    //提供可樂
    public  IDrink createDrinkProduct(){
        return new Cola();
     }
     
     //提供米飯
    public  IFood  createFoodProduct(){
        return new Rice();
     }   
     
     
}

//B餐工廠(提供面條和雪碧)
public class BFactory extends Factory{
    //提供面條
    public  IFood createFoodProduct(){
        return new Noddle();
     }
     
 //提供雪碧
    public  IDrink createDrinkProduct(){
        return new Sprite();
     }
 
}

用法

Factory factory = new AFactory();  
IDrink cola = factory.createDrinkProduct();  
cola.method(); 
IFood riceFood = factory.createFoodProduct(); 
riceFood.method();  
  • 優(yōu)點(diǎn)
    (1)具有工廠方法模式解耦的優(yōu)點(diǎn)。
    (2)工廠模式針對的是一個(gè)產(chǎn)品等級結(jié)構(gòu),抽象工廠模式針對的是面向多個(gè)產(chǎn)品等級結(jié)構(gòu)的。
    最主要的是可以在類內(nèi)部對產(chǎn)品族的關(guān)聯(lián)關(guān)系進(jìn)行定義和描述。
  • 缺點(diǎn) (1)產(chǎn)品族的擴(kuò)展將是一件十分費(fèi)力的事情,假如產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品,則幾乎所有的工廠類都需要進(jìn)行修改。
    (2)在具體工廠類的方法中,對于產(chǎn)品族里的產(chǎn)品,只能使用其中一個(gè)。這也比較容易理解,比如,一個(gè)套餐不會(huì)包含兩款飲料(一款車子不可以搭載兩種空調(diào))。

總結(jié)

1.有利有弊

優(yōu)點(diǎn):將對象的創(chuàng)建統(tǒng)一起來便于維護(hù)和整體把控,對擴(kuò)展開放,對修改封閉
缺點(diǎn):耦合性提高,由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中,這種對條件的判斷和對具體產(chǎn)品類型的判斷交錯(cuò)在一起,很難避免模塊功能的蔓延,對系統(tǒng)的維護(hù)和擴(kuò)展非常不利。

2.使用有限制

從工廠模式的示例可以看出:工廠模式需要類實(shí)現(xiàn)它的接口并且在業(yè)務(wù)內(nèi)部存在明顯的繼承關(guān)系,比如汽車和奔馳寶馬的關(guān)系。而繼承關(guān)系往往存在于模型之間,業(yè)務(wù)之間很難存在繼承關(guān)系,因此如果業(yè)務(wù)內(nèi)部或者業(yè)務(wù)之間沒有這種顯式的繼承關(guān)系該咋辦?就算業(yè)務(wù)內(nèi)部有繼承關(guān)系,各個(gè)業(yè)務(wù)交給你統(tǒng)一管理,這樣就會(huì)提高代碼的耦合性,當(dāng)創(chuàng)建邏輯復(fù)雜的時(shí)候,工廠方法就很復(fù)雜,容易產(chǎn)生干擾。

3.其開閉性優(yōu)點(diǎn)很容易被替代

可以通過高度層次化和模塊化來提高系統(tǒng)的開閉性,而不必生硬地去套用工廠模式。

學(xué)習(xí)參考

設(shè)計(jì)模式——工廠方法模式詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容