設計模式詳解(二)--------工廠模式

一、關於工廠模式

工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。因爲工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以後new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴展性和儘量少的修改量。

總結:工廠模式用來創建實例對象。

工廠模式在一些需要生成複雜對象的情景下建議使用,但是簡單的需求,特別是只需要new就創建對象的時候,其實是不建議去使用工廠模式的,我們在使用工廠模式的時候,必須要引入一個Factory類,這增加了系統的複雜度,所以工廠模式的選擇,需要設計者自己去判斷。

優點:1。程序獲取對象的時候,不用再關心對象實現的過程,通過對象名可以直接獲取到對象實例;2.提高了程序的擴展性,需要新增一個類的時候,直接擴展工廠類即可。

缺點:增加了系統的複雜度。

使用場景

1、日誌記錄器:記錄可能記錄到本地硬盤、系統事件、遠程服務器等,用戶可以選擇記錄日誌到什麼地方。

2、數據庫訪問,當用戶不知道最後系統採用哪一類數據庫,以及數據庫可能有變化時。

3、設計一個連接服務器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作爲產品類,共同實現一個接口。

二、實現

五種不同的計費方式背景下的工廠模式實現

1.創建FeeInterface.java接口(抽象產品)

/**
 * \* User: Baldwin
 * \* E_Mail: [email protected] || [email protected]
 * \* Date: 2020/3/16
 * \* Time: 12:16
 * \* Description:
 * \
 */
public interface FeeInterface {

    String getToken();

    String reqFee();

}

接口中定義兩個方法

2.分別創建三種計費封裝類,並繼承FeeInterface接口(具體產品)

import cn.yzstu.factory.fee.FeeInterface;

/**
 * \* User: Baldwin
 * \* E_Mail: [email protected] || [email protected]
 * \* Date: 2020/3/16
 * \* Time: 12:18
 * \* Description:
 * \
 */
public class GzFee implements FeeInterface {

    public String getToken() {
        return "GzToken";
    }

    public String reqFee() {
        return "GzFee";
    }
}
import cn.yzstu.factory.fee.FeeInterface;

/**
 * \* User: Baldwin
 * \* E_Mail: [email protected] || [email protected]
 * \* Date: 2020/3/16
 * \* Time: 12:19
 * \* Description:
 * \
 */
public class MelonFee implements FeeInterface {
    public String getToken() {
        return "MelonToken";
    }

    public String reqFee() {
        return "MelonFee";
    }
}
import cn.yzstu.factory.fee.FeeInterface;

/**
 * \* User: Baldwin
 * \* E_Mail: [email protected] || [email protected]
 * \* Date: 2020/3/16
 * \* Time: 12:20
 * \* Description:
 * \
 */
public class BeiJingFee implements FeeInterface {
    public String getToken() {
        return "BeiJingoken";
    }

    public String reqFee() {
        return "BeiJingFee";
    }
}

3.創建FeeFactory工廠類(具體工廠)

import cn.yzstu.factory.fee.FeeInterface;
import cn.yzstu.factory.fee.impl.BeiJingFee;
import cn.yzstu.factory.fee.impl.GzFee;
import cn.yzstu.factory.fee.impl.MelonFee;

/**
 * \* User: Baldwin
 * \* E_Mail: [email protected] || [email protected]
 * \* Date: 2020/3/16
 * \* Time: 12:02
 * \* Description:
 * \
 */
public class FeeFactory {
    public FeeInterface getFee(String feeName){
        if (feeName == null) return null;
        FeeInterface feeInterface;
        if ("gzfee".equals(feeName)) {
            feeInterface = new GzFee();
        } else if ("MelonFee".equals(feeName)) {
            feeInterface = new MelonFee();
        } else if ("BeiJing".equals(feeName)) {
            feeInterface = new BeiJingFee();
        }else {
            feeInterface = null;
        }
        return feeInterface;
        
    }
}

4.應用類(產品使用者)

import cn.yzstu.factory.fee.FeeInterface;


/**
 * \* User: Baldwin
 * \* E_Mail: [email protected] || [email protected]
 * \* Date: 2020/3/16
 * \* Time: 12:31
 * \* Description:
 * \
 */
public class Demo {
    public static void main(String[] args) {
        FeeInterface fee = FeeFactory.getFee("BeiJing");
        System.out.println(fee.reqFee());
    }
    
}

5.運行結果

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章