簡單工廠模式

簡單工廠模式

工廠模式定義了一個創建產品的工廠接口,讓子類決定實例化哪一種實例對象,也就是將創建具體實例的工作推遲到了子類當中,核心工廠不再負責具體產品的創建。(具體生產類實現工廠接口,實現接口方法,生產具體實例)

設計原則:

1.開閉原則---對擴展開放,對修改關閉

2.依賴倒置原則----不論是接口還是具體的實例,都應該依賴於抽象的類,(具體model都會繼承一個抽象的類),而不是具體實現類(具體實現類,又可能會修改,破壞了對修改關閉的原則)

試用場景

1.當子類型有可能會有很多,以後需要不斷添加不同的子類實現時。

2.當一個系統尚在框架設計階段,還不知道將來需要實例化哪些具體類時(相當於設計一張設計圖,知識定義了某些規則而已)

java List 使用了工廠模式    


1.public interface List<E> extends Collection<E>    List本身定義就是接口,內部包含Iterator接口,

2.ArrayList 繼承了抽象類 abStractList,   AbstractList 實現了List 接口,(此處就是典型的工廠模式,arrayList 的model 繼承至抽象類,並且實現了對應的接口)

3.源碼中 Iterator是在AbstractList 實現的,(list的方法在abstractlist實現,在arraylist中被重寫)

4.此處的abstractList就是抽象組件(依賴倒置原則),此處的依賴倒置理解爲:a爲接口,如果此時有兩個子類(c,d),如果中間不設置一箇中間件,當a接口發生變化(增加了一個方法newFunc()),此時c,d中都需要修改(增加對a中的newFunc()進行實現),但是如果新建立一個Abstract類 b,b實現了接口,c和d繼承b,這時候c和d只要有選擇的重寫b中的方法就可以,而且a發生變化時,只需要修改b,c和d就可以不需要做任何修改。。此處的AbstractList就是充當b的角色。

demo:

通過反射機制實現的工廠模式

interface Car{
    public void run();
    public void stop();
}


class Benz implements Car{
    public void run(){
        System.out.println("Benz開始啓動了。。。。。");
    }

    public void stop(){
        System.out.println("Benz停車了。。。。。");
    }

}


class Ford implements Car{
    public void run(){
        System.out.println("Ford開始啓動了。。。");
    }

    public void stop(){
        System.out.println("Ford停車了。。。。");
    }

}


class Toyota implements Car{
    public void run(){
        System.out.println("Toyota開始啓動了。。。");
    }

    public void stop(){
        System.out.println("Toyota停車了。。。。");
    }

}


class Factory{
    public static Car getCarInstance(String type){
        Car c=null;
        try {
            c=(Car)Class.forName("org.jzkangta.factorydemo03."+type).newInstance();//利用反射得到汽車類型 
        }
 catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    
        return c;
    }

}

public class FactoryDemo03 {

    public static void main(String[] args) {
        Car c=Factory.getCarInstance("Toyota");
        if(c!=null){
            c.run();
            c.stop();
        }
else{
            System.out.println("造不了這種汽車。。。");
        }

        

    }


}


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