例如有一家服裝廠,可以生產各種上衣,目前可以生產商務上衣和時尚上衣。
介面和類的設計如下:
介面:coat
public inte***ce coat
商務上衣類:
public class businesscoat implements coat
}
時尚上衣類:
public class fashioncoat implements coat
}
有經銷商從該工廠購入服裝,工廠為其生產需要的服裝種類。
客戶端類:
public class client
}
在client中,直接使用到了介面coat的實現類businesscoat和fashioncoat,破壞了封裝隔離的原則。
現在我們使用簡單工廠模式建立factory類,如下:
public class coatfactory ;
public static coat createcoat(int i) else if(i == 2)
return coat;
}}
通常我們把工廠類設計為工具類,私有化其構造器,把其中的方法設定為靜態方法;建立好工廠類之後,將client進行改造,如下:
public class client
}
通過建立工廠類coatfactory,將coat介面和其實現類(businesscoat 和fashioncoat)封裝到一起,使其與client類隔離,實現面向介面程式設計的目的。但是client在呼叫createcoat方法時,需要傳入引數,引數不同返回的實現類不同,這樣clinet必須知道引數的具體含義,所以不得不把createcoat中的部分實現細節暴露給客戶端client。針對這樣的問題,我們可以把引數配置化,寫入到配置檔案中。
配置類createcoat.properties,內容如下:
coatclass=day04.fashioncoat
改造coatfactory,如下:
public class coatfactory ;
public static coat createcoat() catch (ioexception e)
//根據配置,利用反射,建立例項
coat coat = null;
try catch (instantiationexception | illegalacces***ception | classnotfoundexception e)
return coat;
}}
經過如上改造後,client在使用coatfactory時,如下:
public class client
}
可以看出,經過改造,將coat介面和其實現類封裝到了一起,client也已經和coat介面隔離,實現了面向介面程式設計。通過將引數配置檔案化,使整個程式也符合開發的開閉原則。當該工廠決定新增休閒上衣的生產時,我們可以新建casualcoat類,並為不同的經銷商配置相應的coat實現類即可。
何時選用簡單工廠?
1.如果想完全封裝隔離具體實現,讓外部只通過介面來操作封裝體,那可以選用簡單工廠,讓客戶端通過工廠來獲取相應的介面,而無需關心具體實現。
2.如果想把對外建立物件的職責集中管理和控制,可以選擇簡單工廠,乙個簡單工廠可以建立很多的,甚至時不相關的物件,可以把對外建立物件的職責集中的乙個簡單工廠中來,從而實現集中管理和控制。
設計模式 工廠模式之簡單工廠
工廠模式可以分為 簡單工廠模式 普通工廠模式 靜態工廠模式 抽象工廠模式 簡單工廠模式 就是如何去例項化物件的問題,對於很容易變化的問題,應該考慮用乙個單獨的類來做這個創造例項的過程,這個單獨的類就是工廠 例子 通過簡單工廠建立各種圖形的實現過程 簡單工廠模式建立步驟 建立乙個介面 例 圖形介面 建...
設計模式 工廠模式之簡單工廠
我們常見的設計模式,大致可以分為三大類 建立型 結構性 行為型。工廠模式,屬於建立型。工廠模式到底起的是什麼作用呢?概括來說就是解耦。當某一類物件需要頻繁建立的時候,就會和程式產生比較大的耦合,在物件初始化屬性較多時,工廠模式可以較少這種耦合,這就是他的作用。一般情況下根據場景不同,工廠模式有幾種不...
設計模式 工廠模式之簡單工廠模式
定義 由乙個工廠物件 工廠類 來指定建立某乙個產品類的例項。使用場景 客戶端只需傳入指定的引數即可,工廠類負責建立的物件較少 因為指定了傳入的引數 介面類 本想用iphone命名的,見諒 public inte ce phone實現介面類 public class huaweiphone imple...