java設計模式之簡單工廠模式


簡單工廠模式的概念

  就是建立一個工廠類,對實現了同一接口的一些類進行實例的創建。簡單工廠模式的實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類(這些產品類繼承自一個父類或接口)的實例。

簡單工廠模式的UML圖

  

簡單工廠模式代碼

  學習簡單工廠模式的時候我用的是一個與人類有相關的例子。人類在世界分為男人和女人,首先定義一個Human產品的抽象接口

/**
 * This is factory patter package
 */
package com.roc.factory;

/**
 * 產品的抽象接口  人類
 * @author liaowp
 *
 */
public interface Human {
    
    public void say();

}

然后定義男人和女人,同樣都有說話的方法。

/**
 * This is factory patter package
 */
package com.roc.factory;

/**
 * man  男人
 * @author liaowp
 *
 */
public class Man implements Human {

    /* say method
     * @see com.roc.factory.Human#say()
     */
    @Override
    public void say() {
        System.out.println("男人");
    }

}
/**
 * This is factory patter package
 */
package com.roc.factory;

/**女人
 * @author liaowp
 *
 */
public class Woman implements Human {

    /* say method
     * @see com.roc.factory.Human#say()
     */
    @Override
    public void say() {
        System.out.println("女人");
    }

}

最后寫一個工廠類,用來創造男人和女人。第一種方式是使用邏輯判斷的方式實現的。

package com.roc.factory;
/**
 * 簡單工廠
 * @author liaowp
 *
 */
public class SampleFactory {
    public static Human makeHuman(String type){
        if(type.equals("man")){
            Human man = new Man();
            return man;
        }else if(type.equals("womman")){
            Human woman = new Woman();
            return woman;
        }else{
            System.out.println("生產不出來");
            return null;
        }            
    }
}

第二方式是使用java的放射實現的,我覺得這一類的實現方式比較好。

package com.roc.factory;
/**
 * 簡單工廠放射實現
 * @author liaowp
 *
 */
public class SampleFactory1 {
    public static Human makeHuman(Class c){
        Human human = null;
        try {
            human = (Human) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            System.out.println("不支持抽象類或接口");
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("沒有足夠權限,即不能訪問私有對象");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("類不存在");
            e.printStackTrace();
        }    
        return human;
    }
}

最后是客戶端的代碼

package com.roc.factory;
/**
 * 簡單工廠測試
 * @author liaowp
 *
 */
public class Client {
    public static void main(String[] args) {
//        Human man = SampleFactory.makeHuman("man");
//        man.say();
//        Human womman = SampleFactory.makeHuman("womman");
//        womman.say();
//        Human test = SampleFactory.makeHuman("tttt");
        
        Human man = SampleFactory1.makeHuman(Man.class);
        man.say();
        Human woman = SampleFactory1.makeHuman(Woman.class);
        woman.say();
    }
}

 簡單工廠模式應用場景 

  優點:工廠類是整個模式的關鍵.包含了必要的邏輯判斷,根據外界給定的信息,決定究竟應該創建哪個具體類的對象.通過使用工廠類,外界可以從直接創建具體產品對象的尷尬局面擺脫出來,僅僅需要負責“消費”對象就可以了。而不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個 軟件體系結構的優化。
     缺點:由於工廠類集中了所有實例的創建邏輯,違反了 高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中;它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM