1. 程式人生 > >Spring中常用的設計模式:工廠模式

Spring中常用的設計模式:工廠模式

文章目錄

工廠模式

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的反射機制。