不積跬步,不至千里,不積小流,不成江海
阿新 • • 發佈:2019-02-03
工廠模式就相當於建立例項物件的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:工廠模式在這方面的使用較多。