設(shè)計模式學(xué)習(xí)--簡單工廠模式

模式定義

又稱靜態(tài)工廠方法模式,它屬于創(chuàng)建型模式。在簡單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責(zé)創(chuàng)建其他類的實例,被創(chuàng)建的實例通常都是具有共同的父類。


簡單工廠模式結(jié)構(gòu)圖

簡單工廠模式包含如下角色:

1.Factory(工廠角色)

工廠角色即工廠類,它是簡單工廠模式的核心,負責(zé)實現(xiàn)創(chuàng)建所有實例的內(nèi)部邏輯;工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象;在工廠類中提供了靜態(tài)的工廠方法,它返回一個抽象產(chǎn)品類Product,所有的具體產(chǎn)品都是抽象產(chǎn)品的子類。

2.Product(抽象產(chǎn)品角色)

抽象產(chǎn)品角色是簡單工廠模式所創(chuàng)建的所有對象的父類,負責(zé)描述所有實例所共有的公共接口,它的引入將提高系統(tǒng)的靈活性,使得在工廠類中只需定義一個工廠方法,因為所有創(chuàng)建的具體產(chǎn)品對象都是其子類對象。

3.ConcreteProduct(具體產(chǎn)品角色)

具體產(chǎn)品角色是簡單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對象都充當(dāng)這個角色的某個具體類的實例。每一個具體產(chǎn)品角色都繼承了抽象產(chǎn)品角色,需要實現(xiàn)定義在抽象產(chǎn)品中的抽象方法。

模式分析

在簡單工廠模式中,工廠類根據(jù)工廠方法所傳入的參數(shù)來動態(tài)決定應(yīng)該創(chuàng)建出哪一個產(chǎn)品類的實例。
實例:某銷售管理系統(tǒng)支持多種支付方式,如現(xiàn)金支付、信用卡支付、代金券支付等,在設(shè)計中如果不使用簡單工廠模式,可能會存在如下支付方法:

public class Pay {
    public void pay(String type){
        if(type.equalsIgnoreCase("cash")){
            //現(xiàn)金支付處理
        }else if(type.equalsIgnoreCase("creditcard")){
            //信用卡支付處理
        }else if(type.equalsIgnoreCase("voucher")){
            //代金券支付處理
        }
        //...
    }
}

使用簡單工廠模式,可以對原有代碼進行如下改進:
(1)為了保證系統(tǒng)的擴展性并將各種支付類型對象的創(chuàng)建封裝在一個統(tǒng)一的方法中,需要引入抽象支付方式類,它定義了抽象的支付方法,抽象支付方法類定義如下:

public abstract class AbstractPay{
    public void pay(){
        //現(xiàn)金支付處理代碼
    }
}

(2)將每一種支付方式封裝在一個獨立的類中,各個支付方式類相對獨立,修改其中一個,對其他類無任何影響,這些獨立的支付方式類充當(dāng)了具體產(chǎn)品類的角色,是抽象支付方式類的子類,如現(xiàn)金支付類定義如下:

public class CashPay extends AbstractPay{
    public void pay(){
        //現(xiàn)金支付代碼
    }
}

(3)提供一個代碼相對簡單,而且只負責(zé)創(chuàng)建對象而不必關(guān)心對象細節(jié)的工廠類來創(chuàng)建各種具體的支付方式產(chǎn)品類,注意其工廠方法的返回類型是抽象類型,支付方式工廠類定義如下:

public class PayMethodFactory {
    public static AbstractPay getPayMethod(String type){
        if(type.equalsIgnoreCase("cash")){
            return new CashPay();
        }else if(type.equalsIgnoreCase("creditcard")){
            return new CreditcardPay();
        }
    }
} 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 創(chuàng)建型模式 抽象工廠模式(abstract facroty) 3.1模式動機 在工廠方法模式中具體工廠負責(zé)生產(chǎn)具體...
    僚機KK閱讀 814評論 0 2
  • 工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。通常我們所說的工廠模式是指工廠方法模...
    zfylin閱讀 1,403評論 0 7
  • 一個UML類圖 類之間的關(guān)系 類的繼承結(jié)構(gòu)表現(xiàn)在UML中為:泛化(generalize)與實現(xiàn)(realize) ...
    僚機KK閱讀 750評論 0 0
  • 渡過2018年上半年是我人生中會計職業(yè)生涯的第一個年度,在這期間我完成以下事宜: 1、學(xué)習(xí)了基本的費用審核、成本控...
    崽兒9_9閱讀 98評論 0 0
  • grep簡介 在Linux里面,如果按照使用頻率給命令排個序,那么grep絕對榜上有名。 grep的全稱是Glob...
    flycash閱讀 4,111評論 0 0

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