天天看點

我是架構師--設計模式-工廠模式-簡單工廠模式

單例模式寫的太匆忙,今天寫工廠模式,順便簡單的說下UML類圖四種關系:依賴,關聯,泛化(繼承)和實作。

說說依賴與關聯的差別

依賴: 

關聯:

注意箭頭,關聯更像是依賴的一種擴充。 

工廠模式:

工廠模式,通常指的三個模式: 簡單工廠,抽象工廠,工廠方法 三個模式(其實我不大喜歡他們這個命名,剛開始的時候并不能把他們當做模式的名稱,尤其工廠方法)。簡單工廠模式有時候不被叫做一種設計模式(你隻需要知道,這并不重要),我們遵循主流原則,把簡單工廠當做一種設計模式,并首先介紹。

看UML圖:

這個圖中,Factory類作為工廠,專門生産實作了Per接口的所有類。 Performer作為實際實作者。下面我們來個借《Java與模式》的例子,來整體了解一下簡單工廠設計模式。 

<a href="http://yjplxq.blog.51cto.com/attachment/201207/29/4081353_13435784644oQU.jpg"></a>

如果有一個農場,負責銷售各種水果,你作為一個客戶,隻需要對農場的銷售人員說:我要蘋果,農場就會給你蘋果。

轉換成軟體語言: 農場是個服務端,而他對外的接口便是銷售人員,客戶便是用戶端。  用戶端隻需要知道Fruit和 工廠類,就可以得到期望的水果,比如蘋果,而不需要知道其他蘋果或者葡萄的實作類。

水果接口

public interface Fruit{  

void grow();  

void harvest();  

void plant();  

}  

蘋果實作類

/**

* 蘋果

*/

public class Apple implements Fruit{  

  private int treeAge;  

  public void grow(){  

    log("apple grow");  

  }  

  public void harvest(){  

    log("apple harvest");  

  public void plant(){  

    log("apple plant");  

  public void log(String msg){  

    System.out.println(msg);  

然後還有葡萄和草莓類,我就略了。

下面我們編寫工廠類

pulibc class FruitFactory{  

    public static Fruit factory(String which){  

      if(which.equalsIgnoreCase("apple")){  

        return new Apple();  

     }else if(which.equalsIgnoreCase("strawberry")){  

        return new Strawberry()  

     }else if(which.equalsIgnoreCase("grape")){  

        return new Grape();  

     }  

     else {  

      throw new BadFrutException("Bad fruit request!")  

    //如果編寫的自己 的元件,試着定義自己的異常基類  

      }  

   }  

 看看用戶端需要做的:  

FruitFactory.factory("apple"); 

 如果不這麼做,用戶端要得到一個蘋果,那麼需要:

new Apple() 

那麼再要點草莓:

new Strawberry() 

好的,我是伺服器,我忽然想更新了,我覺得Apple這個名字,應該改名叫AppleRed. 于是加了一個新類,并且相容原來的版本,在伺服器并沒有一個好的設計,我不得不保留了Apple這個類。

用戶端:我因為你的更新,而要改變原來的代碼,這太可怕了。

 再看看伺服器端用了工廠模式的好處

伺服器: 平滑更新,不需要釋出新的API告知客戶我做了什麼。

用戶端: 什麼都不需要做。 

何時用簡單工廠模式:

如上面的例子:一般用戶端和服務端的形式的情況,或者編寫插件情況下,喜歡采用簡單工廠方法。

實際應用:

1. spring 中有用到簡單工廠模式

2. 抽象工廠模式 經常用到 簡單工廠模式

有點晚了,抽象工廠和工廠方法相對複雜,容易弄混,下篇文章再介紹。

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/yjplxq/947267,如需轉載請自行聯系原作者