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

簡單工廠模式包含如下角色:
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();
}
}
}