歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java設計模式之簡單工廠模式

Java設計模式之簡單工廠模式

日期:2017/3/1 9:13:36   编辑:Linux編程

近來在學習Java的設計模式,一直覺得設計模式很難,所以一直沒有去接觸,一則是工作比較忙沒有閒工夫去學習,二來是因為自己比較懶所以也懶得動,幸虧今天在公司還挺閒的,所以找了一本書來學習下Java的設計模式。

  1. 簡單工廠的定義
  2. 應用簡單工廠來解決問題的思路
  3. 簡單工廠的結構和說明
  4. 簡單工廠代碼
  5. 使用簡單工廠重寫示例
  6. 模式講解
  7. 簡單工廠中方法的寫法
  8. 簡單工廠的優缺點
  9. 思考簡單工廠

1、簡單工廠的定義

提供一個創建對象實例的功能,而無須關系其具體的實現。被創建實例的類型可以是接口、抽象類,也可以是具體的類。

2、應用簡單工廠來解決問題的思路

簡單工廠就是不能讓模塊外部知道模塊內部的具體實現,但是模塊內部還是可以知道實現類的,而且創建接口是需要知道具體的實現類的。
所以,干脆在模塊內部新建一個類,在這個類裡面來創建接口,然後把創建的接口返回給具體調用者,這樣,外部應用就只需根據這個類來獲取相應的接口對象,然後就可以操作接口定義的方法了。把這樣的對象就稱作簡單工廠,就叫它Factory。

3、簡單工廠的結構和說明

簡單工廠的結果如下圖所示。

  • Api:定義客戶所需的功能接口。
  • Impl:具體實現Api的實現類,可有多個,根據具體業務。
  • Factory:工廠,選擇合適的實現類來創建Api接口對象。
  • Client:客戶端,通過Factory來獲取Api接口對象,然後面向Api接口編程。

4、簡單工廠代碼

(1)Api定義代碼如下:

public interface Api {
    /**
     * 示意,具體功能方法的定義
     * @param s 示意,需要的參數
     */
    public void operation(String s);
}

(2)定義了接口後,實現類ImplA代碼如下:

public class ImplA implements Api {
    @Override
    public void operation(String s) {
        System.out.println("ImplA s==" + s);
    }
}

實現類ImplB.java代碼如下

public class ImplB implements Api {
    @Override
    public void operation(String s) {
        System.out.println("ImplB s==" + s);
    }
}

(3)簡單工廠的實現。代碼如下:

/**
 * 工廠類,用於穿件Api對象
 * @author veione
 */
public class Factory {
    /**
     * 具體創建Api對象的方法
     * @param condition 示意,從外部傳入的選擇條件
     * @return 創建好的Api對象
     */
    public static Api createApi(int condition) {
        //根據條件來創建具體實現對象
        Api api = null;
        if (condition == 1) {
            api = new ImplA();
        } else if (condition == 2) {
            api = new ImplB();
        }
        return api;
    }
}

(4)再來看下客戶端的示意,代碼如下:

/**
 * 客戶端,使用Api接口
 * @author veione
 */
public class Client {
    public static void main(String[] args) {
        // 通過簡單工廠來獲取接口對象
        Api api = Factory.createApi(1);
        api.operation("使用簡單工廠進行操作");
    }
}

5、使用簡單工廠重寫示例

要使用簡單工廠來重寫前面的示例,主要就是創建一個簡單工廠對象,讓簡單工廠來負責創建接口對象。後客戶端通過工廠獲取接口對象,而不再由客戶端自己創建接口對象了。
系統結構如下圖所示:

(1)接口Api和實現類Impl和前面的示例一樣,在此不再贅述。

(2)新創建一個簡單工廠的對象。代碼如下:

/**
 * 工廠類,用來創建Api對象
 */
 public class Factory{
     /**
      * 具體創建Api對象的方法
      * @return 創建好的Api對象
      */
      public static Api createApi(){
          //由於只有一個實現就無需再條件判斷了
          return new Impl();
      }
 }

(3)使用簡單工廠

這個時候客戶端就不用再自己創建接口對象了,應該使用工廠來獲取。改造後代碼如下:

/**
 * 客戶端:測試使用Api接口
 */
 public class Client{
     public static void main(String[] args){
        Api api=Factory.createApi();
        api.test1("Hello,World!簡單那工廠");
     }
 }

模式講解

1、簡單工廠的功能

工廠就是用來生產東西的。在Java裡面,通常情況下是用來創建接口的,但是也可以創造抽象類,甚至是一個具體類的實例。

2、靜態工廠

使用簡單工廠的時候,通常不用創建簡單工廠類實例,沒有創建實例的必要。因此可以把簡單那工廠類實現成一個工具類,直接使用靜態方法即可。也就是說簡單工廠的方法通常是靜態的,所以也被稱為靜態工廠。如果要防止客戶端無謂地創造簡單工廠實例,還可以把簡單工廠的構造方法私有化。

3、萬能工廠

一個簡單工廠可以包含很多用來構造東西的方法,這些方法可以創建不同的接口、抽象類或者類實例。一個簡單工廠理論上可以構造任何東西,所以又稱之為“萬能工廠”。
雖然上面的實例在簡單工廠裡面只有一個方法,但事實上,是可以有很多這樣的創建方法的,這點要注意。

4、簡單工廠創建對象的范圍

雖然從理論上講,簡單工廠什麼都能創建,但對於簡單工廠可創建對象的范圍,通常不要太大,建議控制在一個獨立的組件級別或者一個模塊級別,也就是一個組件或模塊簡單工廠。否則這個簡單工廠類會職責不明,有點大雜燴的感覺。

5、簡單工廠的調用順序示意圖

uml用例圖不太會使用,所以這裡大家參考一下即可。

簡單工廠中方法的寫法

雖然說簡單工廠的方法大多是用來創建接口的,但是仔細分析你會發現,真正能實現功能的是具體的實現類,這些實現類是已經做好的,並不是真的要靠簡單工廠來創建出來的,簡單工程的方法無外乎就是:實現了選擇一個合適的實現類來使用。
所以說簡單工廠方法內部主要實現的功能是選擇合適的實現類來創建實例對象。既然要實現選擇,那麼就需要選擇的條件或者是選擇的參數,選擇條件或是參數的來源通常又分為以下幾種:

  • 來源與客戶端:由Client來傳入參數
  • 來源於配置文件,從配置文件獲取用於判斷的值
  • 來源於程序運行時期的某個值,比如從緩存中獲取某個運行期的值。

簡單工廠的優缺點

簡單工廠有以下優點。

  • 幫助封裝

    簡單工廠雖然很簡單,但是非常有好的幫助我們實現了組件的封裝,然後讓組件外部能真正面向接口編程。

  • 解耦

    通過簡單工廠實現了客戶端和具體實現類的解耦。

簡單工廠有以下缺點。

  • 可能增加客戶端的復雜度

如果通過客戶端的參數來選擇具體的實現類,那麼就必須讓客戶端理解各個參數所代表的具體功能和含義,這樣會增加客戶端使用的難度,也部分暴露了內部實現,這種情況可以選用可配置的方式來實現。

  • 不方便擴展子工廠

私有化簡單工廠的構造方法,使用靜態方法來創建接口,也就不能通過寫簡單工廠類的子類來改變創建接口的方法行為了。不過,通常情況下是不需要為簡單工廠創建子類的。

思考簡單工廠

1、簡單工廠的本質

簡單工廠的本質就是:選擇實現

2、何時選用簡單工廠

建議在以下情況中選用簡單工廠。

  • 如果想要完成封裝隔離具體實現,讓外部只能通過接口來操作封裝體,那麼可以選用簡單工廠,讓客戶端通過工廠來獲取相應的接口,而無須關系具體的實現。
  • 如果想要把對外創建對象的職責集中管理和控制,可以選用簡單工廠,一個簡單那工廠可以創建很多的、不相關的對象,可以把對外創建對象的職責集中到一個簡單工廠來,從而實現集中管理和控制。

水水水水水水水水水水水水水水水水

Copyright © Linux教程網 All Rights Reserved