當前位置:編程學習大全網 - 編程語言 - java編寫壹個有關接口的程序

java編寫壹個有關接口的程序

給妳的也不是什麽系統之類的.

也就是壹個思想而已,想了壹下用<設計模式之Factory>來回答妳的問題.

///////////////////////////////////////////////////////////////

工廠模式定義:提供創建對象的接口.

為何使用?

工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。

為什麽工廠模式是如此常用?因為工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以後new時就要多個心眼,是否可以考慮實用工廠模式,雖然這樣做,可能多做壹些工作,但會給妳系統帶來更大的可擴展性和盡量少的修改量。

我們以類Sample為例, 如果我們要創建Sample的實例對象:

Sample sample=new Sample();

可是,實際情況是,通常我們都要在創建sample實例時做點初始化的工作,比如賦值 查詢數據庫等。

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

Sample sample=new Sample(參數);

但是,如果創建sample實例時所做的初始化工作不是象賦值這樣簡單的事,可能是很長壹段代碼,如果也寫入構造函數中,那妳的代碼很難看了(就需要Refactor重整)。

為什麽說代碼很難看,初學者可能沒有這種感覺,我們分析如下,初始化工作如果是很長壹段代碼,說明要做的工作很多,將很多工作裝入壹個方法中,相當於將很多雞蛋放在壹個籃子裏,是很危險的,這也是有背於Java面向對象的原則,面向對象的封裝(Encapsulation)和分派(Delegation)告訴我們,盡量將長的代碼分派“切割”成每段,將每段再“封裝”起來(減少段和段之間偶合聯系性),這樣,就會將風險分散,以後如果需要修改,只要更改每段,不會再發生牽壹動百的事情。

在本例中,首先,我們需要將創建實例的工作與使用實例的工作分開, 也就是說,讓創建實例所需要的大量初始化工作從Sample的構造函數中分離出去。

這時我們就需要Factory工廠模式來生成對象了,不能再用上面簡單new Sample(參數)。還有,如果Sample有個繼承如MySample, 按照面向接口編程,我們需要將Sample抽象成壹個接口.現在Sample是接口,有兩個子類MySample 和HisSample .我們要實例化他們時,如下:

Sample mysample=new MySample();

Sample hissample=new HisSample();

隨著項目的深入,Sample可能還會\"生出很多兒子出來\", 那麽我們要對這些兒子壹個個實例化,更糟糕的是,可能還要對以前的代碼進行修改:加入後來生出兒子的實例.這在傳統程序中是無法避免的.

但如果妳壹開始就有意識使用了工廠模式,這些麻煩就沒有了.

工廠方法

妳會建立壹個專門生產Sample實例的工廠:

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);

這樣,在整個就不涉及到Sample的具體子類,達到封裝效果,也就減少錯誤修改的機會,這個原理可以用很通俗的話來比喻:就是具體事情做得越多,越容易範錯誤.這每個做過具體工作的人都深有體會,相反,官做得越高,說出的話越抽象越籠統,範錯誤可能性就越少.好象我們從編程序中也能悟出人生道理?呵呵.

使用工廠方法 要註意幾個角色,首先妳要定義產品接口,如上面的Sample,產品接口下有Sample接口的實現類,如SampleA,其次要有壹個factory類,用來生成產品Sample,如下圖,最右邊是生產的對象Sample:

進壹步稍微復雜壹點,就是在工廠類上進行拓展,工廠類也有繼承它的實現類concreteFactory了。

抽象工廠

工廠模式中有: 工廠方法(Factory Method) 抽象工廠(Abstract Factory).

這兩個模式區別在於需要創建對象的復雜程度上。如果我們創建對象的方法變得復雜了,如上面工廠方法中是創建壹個對象Sample,如果我們還有新的產品接口Sample2.

這裏假設:Sample有兩個concrete類SampleA和SamleB,而Sample2也有兩個concrete類Sample2A和SampleB2

那麽,我們就將上例中Factory變成抽象類,將***同部分封裝在抽象類中,不同部分使用子類實現,下面就是將上例中的Factory拓展成抽象工廠:

public abstract class Factory{

public abstract Sample creator();

public abstract Sample2 creator(String name);

}

public class SimpleFactory extends Factory{

public Sample creator(){

.........

return new SampleA

}

public Sample2 creator(String name){

.........

return new Sample2A

}

}

public class BombFactory extends Factory{

public Sample creator(){

......

return new SampleB

}

public Sample2 creator(String name){

......

return new Sample2B

}

}

從上面看到兩個工廠各自生產出壹套Sample和Sample2,也許妳會疑問,為什麽我不可以使用兩個工廠方法來分別生產Sample和Sample2?

抽象工廠還有另外壹個關鍵要點,是因為 SimpleFactory內,生產Sample和生產Sample2的方法之間有壹定聯系,所以才要將這兩個方法捆綁在壹個類中,這個工廠類有其本身特征,也許制造過程是統壹的,比如:制造工藝比較簡單,所以名稱叫SimpleFactory。

在實際應用中,工廠方法用得比較多壹些,而且是和動態類裝入器組合在壹起應用.

....後面還有壹些,但是我想這些應該可以解決妳想知道的了.

  • 上一篇:遠程數據采集系統設計,數據傳輸到上位機。通過3G無線傳輸,傳到監控中心後,怎麽把數據存儲SQL數據庫中
  • 下一篇:新手求答:關於自制51編程器的制作的問題
  • copyright 2024編程學習大全網