1. 程式人生 > >不積跬步,不至千里,不積小流,不成江海

不積跬步,不至千里,不積小流,不成江海

工廠模式就相當於建立例項物件的new,我們經常要根據類Class生成例項物件,如A a=new A(). 工廠模式也是用來建立例項物件的,可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量。

類Sample為例,要建立Sample的例項物件:

Sample sample=new Sample();
可是,實際情況是,通常我們都要在建立sample例項時做點初始化的工作,比如賦值 查詢資料庫等

首先,我們想到的是,可以使用Sample的建構函式,這樣生成例項就寫成:

Sample sample=new Sample(引數);


 但是,如果建立sample例項時所做的初始化工作不是象賦值這樣簡單的事,可能是很長一段程式碼,如果也寫入建構函式中,那你的程式碼很難看了



初始化工作如果是很長一段程式碼,說明要做的工作很多,將很多工作裝入一個方法中,相當於將很多雞蛋放在一個籃子裡,是很危險的,這也是有背於Java面向物件的原則,面向物件的封裝(Encapsulation)和分派(Delegation)告訴我們,儘量將長的程式碼分派“切割”成每段,將每段再“封裝 ”起來(減少段和段之間偶合聯絡性),這樣,就會將風險分散,以後如果需要修改,只要更改每段,不會再發生牽一動百的事情。

我們需要將建立例項的工作與使用例項的工作分開, 也就是說,讓建立例項所需要的大量初始化工作從Sample的建構函式中分離出去。

你想如果有多個類似的類,我們就需要例項化出來多個類。這樣程式碼管理起來就太複雜了。

這個時候你就可以採用工廠方法來封裝這個問題。
不能再用上面簡單new Sample(引數)。還有,如果Sample有個繼承如MySample, 按照面向介面程式設計,我們需要將Sample抽象成一個介面.現在Sample是介面,有兩個子類MySample 和HisSample

Sample mysample=new MySample();
Sample hissample=new HisSample();


採用工廠封裝:

public class Factory{

  public static Sample creator(int which){

  //getClass 產生Sample 一般可使用動態類裝載裝入類。
  if (which==1)
    return new SampleA();
  else if (which==2)
    return new SampleB();

  }

}


那麼在你的程式中,如果要例項化Sample時.就使用

Sample sampleA=Factory.creator(1);


舉個更實際的例子,比如你寫了個應用,裡面用到了資料庫的封裝,你的應用可以今後需要在不同的資料庫環境下執行,可能是oracle,db2,sql server等,那麼連線資料庫的程式碼是不一樣的,你用傳統的方法,就不得不進行程式碼修改來適應不同的環境,非常麻煩,但是如果你採用工廠類的話,將各種可能的資料庫連線全部實現在工廠類裡面,通過你配置檔案的修改來達到連線的是不同的資料庫,那麼你今後做遷移的時候程式碼就不用進行修改了。

我通常都是用xml的配置檔案配置許多型別的資料庫連線,非常的方便。PS:工廠模式在這方面的使用較多。