目錄
工廠模式
爲了便於理解,這裏做一個小案例:
1、首先製造一個牛奶類:
public interface Milk {
/**
* 獲取一個標準產品
* @return
*/
public String getName();
}
2、然後製造很多的具體牛奶類,實現這個接口:
蒙牛類:
public class Mengniu implements Milk {
public String getName() {
return "蒙牛";
}
}
特侖蘇類:
public class Telunsu implements Milk {
public String getName() {
return "特侖蘇";
}
}
伊利類:
public class Yili implements Milk {
public String getName() {
return "伊利";
}
}
簡單工廠模式
含義:
- 簡單工廠模式(Simple Factory Pattern)是指由一個工廠對象決定創建出哪一種產品類的實例。
適用場景:
- 工廠類負責創建的對象較少。
- 客戶端只需要傳入工廠類的參數,對於如何創建對象的邏輯不需要關心。
優點:
- 只需傳入一個正確的參數,就可以獲取你所需要的對象無須知道其創建的細節。
缺點 :
- 工廠類的職責相對過重,增加新的產品時需要修改工廠類的判斷邏輯,違背開閉原則。
- 不易於擴展過於複雜的產品結構。
1、創建一個簡單工廠
public class SimpleFactory {
public Milk getMilk(String name){
if("特侖蘇".equals(name)){
return new Telunsu();
}else if("伊利".equals(name)){
return new Yili();
}else if("蒙牛".equals(name)){
return new Mengniu();
}else {
System.out.println("不能生產您所需的產品");
return null;
}
}
}
2、測試簡單工廠模式
public static void main(String[] args) {
//這個new的過程實際上一個比較複雜的過程
//有人民幣及不需要自己new了
System.out.println(new Telunsu().getName());
//小作坊式的生產模式
//用戶本身不再關心生產的過程,而只需要關心這個結果
//假如:特侖蘇、伊利、蒙牛
//成分配比都是不一樣的
SimpleFactory factory = new SimpleFactory();
//把用戶的需求告訴工廠
//創建產品的過程隱藏了,對於用戶而且完全不清楚是怎麼產生的
System.out.println(factory.getMilk("特侖蘇").getName());
}
工廠方法模式
含義:
- 工廠方法模式(Fatory Method Pattern)是指定義一個創建對象的接口,但讓實現這個接口的類來決定實例化哪個類,工廠方法讓類的實例化推遲到子類中進行。主要解決產品擴展的問題。
適用場景:
- 創建對象需要大量重複的代碼。
- 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
- 一個類通過其子類來指定創建哪個對象。
優點:
- 用戶只需關心所需產品對應的工廠,無須關心創建細節。
- 加入新產品符合開閉原則,提高了系統的可擴展性。
缺點 :
- 類的個數容易過多,增加了代碼結構的複雜度。
- 增加了系統的抽象性和理解難度。
1、創建工廠
public interface Factory {
//工廠必然具有生產產品技能,統一的產品出口
Milk getMilk();
}
2、創建工廠實現類
public class MengniuFactory implements Factory {
public Milk getMilk() {
return new Mengniu();
}
}
public class TelunsuFactory implements Factory {
public Milk getMilk() {
return new Telunsu();
}
}
public class YiliFactory implements Factory {
public Milk getMilk() {
return new Yili();
}
}
3、測試工廠方法模式
public static void main(String[] args) {
//System.out.println(new Factory().getMilk(););
//貨比三家
//不知道誰好誰好誰壞
//配置,可能會配置錯
Factory factory = new SanluFactory();
System.out.println(factory.getMilk());
}
抽象工廠模式
含義:
- 抽象工廠模式(Abastract Factory Pattern)是指提供一個創建一系列相關或相互依賴對象的接口,無須指定他們具體的類。
- 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節,強調的是一系列相關的產品對象(屬於同一產品族)一起使用創建對象需要大量重複的代碼。需要提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。
適用場景:
- 客戶端(應用層)不依賴於產品類實例如何被創建、實現等細節。
- 強調一系列相關的產品對象(屬於同一產品族)一起使用創建對象需要大量重複的代碼。
- 提供一個產品類的庫,所有的產品以同樣的接口出現,從而使客戶端不依賴於具體實現。
優點:
- 具體產品在應用層代碼隔離,無須關心創建細節
- 將一個系列的產品族統一到一起創建。
缺點 :
- 規定了所有可能被創建的產品集合,產品族中擴展新的產品困難,需要修改抽象工廠的接口。
- 增加了系統的抽象性和理解難度。
1、創建抽象工廠
public abstract class AbstractFactory {
//公共的邏輯
//方便於統一管理
/**
* 獲得一個蒙牛品牌的牛奶
* @return
*/
public abstract Milk getMengniu();
/**
* 獲得一個伊利品牌的牛奶
* @return
*/
public abstract Milk getYili();
/**
* 獲得一個特侖蘇品牌的牛奶
* @return
*/
public abstract Milk getTelunsu();
}
2、創建抽象工廠實現類
public class MilkFactory extends AbstractFactory {
@Override
public Milk getMengniu() {
return new Mengniu();
}
@Override
public Milk getYili() {
return new Yili();
}
@Override
public Milk getTelunsu() {
return new Telunsu();
}
}
3、測試抽象工廠模式
public static void main(String[] args) {
MilkFactory factory = new MilkFactory();
//對於用戶而言,更加簡單了
//用戶只有選擇的權利了,保證了程序的健壯性
System.out.println(factory.getMengniu());
}