利用反射增強工廠模式

利用反射增強工廠模式

之前寫了一個工廠模式的例子,工廠模式在任何設計模式的書中都會優先介紹到,實在是因爲它的應用非常普遍,但是之前的例子上如果增加其他的子類,勢必要重新改寫Factory工廠類,纔行,具體鏈接如下:
http://blog.csdn.net/zwq1232113457/article/details/52055713
在這裏我將我所學習到反射知識運用在工廠模式上就可以增加代碼的靈活性。

二話不說,
入正題:


public interface People {
    public abstract void MadeMan();
}
public class Yellow implements People {
    public void MadeMan() {
        System.out.println("造黃種人");
    }
}
public class Black implements People {
    public void MadeMan() {
        System.out.println("造黑種人");
    }
}
public class White implements People {
    public void MadeMan() {
        System.out.println("造白種人");
    }
}
public class Factory {
    public static People getInstance(int i){
        People p = null;
        if(i == 1){
            p = new Yellow();
        }else if(i == 2){
            p = new Black();
        }else if(i == 3){
            p = new White();
        }
        return p;
    }
}
public class Nova {
    public static void main(String[] args) {
        System.out.println("輸入數字:1.黃種人。2.黑種人。3.白種人");
        Scanner in = new Scanner(System.in);
        int i = in.nextInt();
        People p = Factory.getInstance(i);
        p.MadeMan();

    }
}

這樣的話,在增加一個子類時都需要修改工廠類,這樣很麻煩。我們將factory類進行更改。

public class Factory {
    public static People getInstance(String className){
        People p = null;
        try {
            p = (People) Class.forName(className).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return p;
    }
}
public class Nova {
    public static void main(String[] args) {    
        People p = Factory.getInstance("moon.star.nova.Black");
        p.laugh();  
    }
}

如此,使用了反射操作取得People實例,這樣無論增加多少個子類,工廠類都不用做任何的修改。


進階:結合配置文件動態創建實例
雖然上面的方法可以動態的獲取People的實例了,但是操作時需要傳入完整的包名.類名。況且實際使用時,用戶並不能都知道接口下到底有多少供使用的子類,所以可以使用屬性文件來配置所需的子類的信息。

首先我們先在接口類所在包中創建一個People.properties文件。
People.properties內容如下:

Black=moon.star.nova.Black
Yellow=moon.star.nova.Yellow
White=moon.star.nova.White

這樣我們在屬性文件中,寫入了所需的配置信息,我們只需操作屬性即可了,但是想要操作屬性,我們還需一個屬性的操作類。

class Init {

    public static Properties getPro()
    {
        Properties pro=new Properties();
        InputStream in=null;
        try {
            //從此類所在的包下取資源
            in=Init.class.getResourceAsStream("People.properties");
            pro.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally{
            try{
                in.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }

        return pro;
    }
}

//Init類用於操作文件People.properties。

public class Nova {
    public static void main(String[] args) {
        Properties pro = Init.getPro();
        People p = Factory.getInstance(pro.getProperty("Black"));
        p.laugh();

    }
}

如此,用戶只要知道Black,Yellow,White。而不用知道moon.star.Black。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章