Spring中常用的設計模式:工廠模式
阿新 • • 發佈:2018-11-16
文章目錄
工廠模式
Beanfactory是一個類工廠,但和傳統的類工廠不同。傳統的類工廠僅負責構造一個或幾個類的例項;而BeanFactory是類的通用工廠,不僅提供了建立Bean的功能,還提供了Bean例項快取、生命週期管理、Bean例項代理等服務,最重要的是還管理著Bean和Bean之間的依賴關係。在 Spring 中有許多的 IoC 容器的實現供使用者選擇和使用。
例項
SpringIoc和工廠模式(反射實現)
1. 先實現簡單工廠
interface Fruit {
public void eat();
}
class Apple implements Fruit {
public void eat() {
System.out.println("吃蘋果。");
}
}
class Orange implements Fruit {
public void eat() {
System.out.println("吃橘子");
}
}
class Factory { // 工廠類
public static Fruit getInstance(String className) {
Fruit f = null;
if (className.equals("apple")) {
f = new Apple();
}
if (className.endsWith("orange")) {
f = new Orange();
}
return f;
}
}
public class FactoryDemo {
public static void main(String args[]) {
Fruit f = Factory.getInstance("apple");
f.eat();
}
}
問題:若增加新水果,如香蕉,則工廠類也要修改。
解決:java的反射機制。
2. 工廠類(修改)
class Factory {
public static Fruit getInstance(String className) {
Fruit f = null;
try {
f = (Fruit) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
問題:建立例項時,需要提供完整的類名。
3. 增加配置檔案
class PropertiesOperate{
private Properties pro=null;
private File file=new File("d:"+File.separator+"fruit.properties");
public PropertiesOperate(){
pro=new Properties();
if(file.exists()){
try {
pro.loadFromXML(new FileInputStream(file));
} catch (Exception e) {
e.printStackTrace();
}
}else{
this.save();
}
}
private void save(){
pro.setProperty("apple","org.Apple");
pro.setProperty("orange", "org.Orange");
try {
pro.storeToXML(new FileOutputStream(this.file),"Fruit");
} catch (Exception e) {
e.printStackTrace();
}
}
public Properties getProperties(){
return pro;
}
}
4. 測試類
public class FactoryDemo3 {
public static void main(String args[]) {
Properties pro=new PropertiesOperate().getProperties();
Fruit f= Factory.getInstance(pro.getProperty("orange"));
f.eat();
}
}
5. 總結
通過配置檔案,可以控制程式的執行,現在看起來有點像Spring的IoC了。
該程式使用了工廠模式,把所有的類放在一個Factory裡面,而為了動態的管理這些類(即使增加了新的Fruit類,這個工廠也不用變化),就用了java的反射機制。