炒冷飯系列:設計模式 工廠模式

weixin_33860553發表於2014-07-19

摘要: 摘要: 原創出處: http://www.cnblogs.com/Alandre/ 泥沙磚瓦漿木匠 希望轉載,保留摘要,謝謝!

事雖險,吾善為;苟擅為,子道虧。物雖小,勿私藏;苟私藏,親心傷。

一、什麼是簡單工廠模式

簡單工廠模式屬於類的建立型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負責建立 其他類的例項,被建立的例項通常都具有共同的父類。

二、模式中包含的角色及其職責

1.工廠(Creator)角色
簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。工廠類可以被外界直接呼叫,建立所需的產品物件。

2.抽象(Product)角色
簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所共有的公共介面。

3.具體產品(Concrete Product)角色
簡單工廠模式所建立的具體例項物件

注意:1.在工廠類中,實現邏輯。最好不能再子類或者父類中實現程式碼邏輯。2.物件子類繼承父類的介面。

下面我們來個一個關於工廠類的最簡單的例子:
先給出一個介面父類 Fruit.java,並且賦予採集方法

public interface Fruit
{
    /*
     * 採集
     */
    public void get();
}

隨後,有兩個實體類 Apple.java 和 Banana.java

public class Apple implements Fruit
{
    /*
     * 採集
     */
    public void get()
    {
        System.out.println("採集Apples");
    }
}



public class Apple implements Fruit
{
    /*
     * 採集
     */
    public void get()
    {
        System.out.println("採集Apples");
    }
}

這樣,我們彷彿有了原材料,簡單工廠模式,就像工廠產出商家所需要的東西。

    image

三.簡單工廠類FruitFactory.java的升級之路

粗劣的版本如下:

public class FruitFactory
{
    /**
     * 獲得Apple類例項
     */
    public static Fruit getApple()
    {
        return new Apple();
    }
    
    /**
     * 獲得Banana類例項
     */
    public static Fruit getBanana()
    {
        return new Banana();
    }

}

升級下:

public class FruitFactory
{/**
     * get方法,獲得所有產品物件
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     */
    public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException
    {
        if (type.equalsIgnoreCase("apple"))
        {
            return Apple.class.newInstance();
        }else if (type.equalsIgnoreCase("apple"))
        {
            return Banana.class.newInstance();
        }else
            return null;
    }
}

在思考,究極版:

public class FruitFactory
{
    /**
     * get方法,獲得所有產品物件
     * @throws IllegalAccessException 
     * @throws InstantiationException 
     * @throws ClassNotFoundException 
     */
    public static Fruit getFruit(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException
    {
        Class<?> fruit = Class.forName(type);
        return (Fruit)fruit.newInstance();
    }
}

測試下,我們的工廠:

public class MainClass
{
    public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException
    {
        Fruit apple = FruitFactory.getFruit(Apple.class.getName());
        Fruit banana = FruitFactory.getFruit(Banana.class.getName());
        
        apple.get();
        banana.get();
    }
}

你可以看到列印出:

採集Apples
採集Banana

 

相關資料:

java.lang.Class<T>

static Class<?> forName(String className)
          返回與帶有給定字串名的類或介面相關聯的 Class 物件。

public T newInstance()

          Creates a new instance of the class represented by this {@code Class}

public final Class<?> getClass()
返回此 Object 的執行時類。返回的 Class 物件是由所表示類的 static synchronized 方法鎖定的物件。
 

簡單工廠模式的優缺點

在這個模式中,工廠類是整個模式的關鍵所在。它包含必要的判斷 邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的 物件。使用者在使用時可以直接根據工廠類去建立所需的例項,而無 需瞭解這些物件是如何建立以及如何組織的。有利於整個軟體體系 結構的優化。不難發現,簡單工廠模式的缺點也正體現在其工廠類上,由於工廠類集中 了所有例項的建立邏輯,所以“高內聚”方面做的並不好。另外,當系統中的 具體產品類不斷增多時,可能會出現要求工廠類也要做相應的修改,擴充套件 性並不很好。

五 感謝知識來源和小結

一、什麼是簡單工廠模式

二、模式中包含的角色及其職責

三.簡單工廠類FruitFactory.java的升級之路

四.簡單工廠模式的優缺點

來自:java設計模式

如以上文章或連結對你有幫助的話,別忘了在文章按鈕或到頁面右下角點選 “贊一個” 按鈕哦。你也可以點選頁面右邊“分享”懸浮按鈕哦,讓更多的人閱讀這篇文章。

親所好,力為具;親所惡,謹為去。身有傷,貽親憂;德有傷,貽親羞。

相關文章