java基礎_設計模式_抽象工廠模式

1.工廠模式出現的原因,即有什麼樣的需求?
簡單的舉個例子:好多遊戲都存在皮膚的概念,當你換皮膚的時候整個遊戲的風格比如按鈕、菜單、對話框等等 全部都替換了,再者,當新建一套新的皮膚的時候,要儘量做到無需修改已有的東西。在這一套皮膚中,這都是一系列的產品。如何能實現這樣效果?

工廠模式的概念:爲創建對象提供過度接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。

這是我demo實現的效果:

public static void main(String[] args) {

        /**
         * 1.當你想換整個一系列產品或者主題的時候  只要改這一個地方就可以了  (將要我把這東西卸載配置文件中 源代碼都不用改變 只要改配置文件就好)
         * 2.當你想創建自己新的主題時 只要根據創建相應的屬性屬性就可
         *  這就比較偏向於 更容易的擴展 和 更便捷的替換
         */

//        AbstarctFactory factory = new BlueThemeFactory();

        AbstarctFactory factory = new BlackThemeFactory();
        Button button = factory.createButton();
        button.click();

        Dialog dialog = factory.createDialog();
        dialog.tips();

        Menu menu = factory.createMenu();
        menu.dragger();
    }
當我想切換主題的時候  只要改爲BlackThemeFactory()即可,或者再想新加一套皮膚的時候同樣操作簡單。效果如下:


改爲BlackThemeFactory()後:

看到了沒,當你想替換一整套時改動的地方只要一點就可以了。

首先我認爲面向抽象編程在這裏的體現就是 1.替換方便 2.擴展容易。

2.怎麼去實現呢?

這該怎麼說呢,抽象的東西本來就難理解。

先看代碼吧。

定義父類的工廠:

/**
 * 創建工廠的父類
 */

public abstract class AbstarctFactory {

    public abstract Button createButton();

    public abstract Dialog createDialog();

    public abstract Menu createMenu();

}

按鈕:

/**
 * 抽象的按鈕 定義爲抽象
 */

public abstract class Button {
    public abstract void click();
}

對話框:

public abstract class Dialog {
    public abstract void tips();
}
public abstract class Menu {
    public abstract void dragger();
}

黑色主題:

/**
 * 產生黑色主題的工廠
 */

public class BlackThemeFactory extends AbstarctFactory {
    @Override
    public Button createButton() {
        return new BlackButton();
    }

    @Override
    public Dialog createDialog() {
        return new BlackDialog();
    }

    @Override
    public Menu createMenu() {
        return new BlackMenu();
    }

}
對應的:
/**
 * 黑色按鈕
 */

public class BlackButton extends Button {

    /**
     * 按鈕可以點擊
     */
    @Override
    public void click() {
        System.out.println("黑色按鈕點擊");
    }
}
/**
 * 黑色對話框
 */

public class BlackDialog extends Dialog {

    /**
     * 可以提示的對話框
     */
    @Override
    public void tips() {
        System.out.println("黑色對話框提示");
    }
}
/**
 * 黑色菜單
 */

public class BlackMenu extends Menu {

    /**
     * 可以拖拽的屬性
     */
    @Override
    public void dragger() {
        System.out.println("黑色菜單拖拽");
    }
}

藍色主題相關:

/**
 * 產生藍色主題的工廠
 */

public class BlueThemeFactory extends AbstarctFactory{
    @Override
    public Button createButton() {
        return new BlueButton();
    }

    @Override
    public Dialog createDialog() {
        return new BuleDialog();
    }

    @Override
    public Menu createMenu() {
        return new BlueMenu();
    }

}

對應的

/**
 * 藍色按鈕
 */

public class BlueButton extends Button{

    /**
     * 按鈕可以點擊
     */
    @Override
    public void click() {
        System.out.println("藍色按鈕點擊");
    }
}
/**
 * 藍色菜單
 */

public class BlueMenu extends Menu {

    /**
     * 可以拖拽的屬性
     */
    @Override
    public void dragger() {
        System.out.println("藍色菜單拖拽");
    }
}
/**
 * 藍色對話框
 */

public class BuleDialog extends Dialog {

    /**
     * 可以提示的對話框
     */
    @Override
    public void tips() {
        System.out.println("藍色對話框提示");
    }
}
當我們想切換一套主題的時候只要改一點地方就好了:

public class TestAbstractFactory {
    public static void main(String[] args) {

        /**
         * 1.當你想換整個一系列產品或者主題的時候  只要改這一個地方就可以了  (將要我把這東西卸載配置文件中 源代碼都不用改變 只要改配置文件就好)
         * 2.當你想創建自己新的主題時 只要根據創建相應的屬性屬性就可
         *  這就比較偏向於 更容易的擴展 和 更便捷的替換
         */

//        AbstarctFactory factory = new BlueThemeFactory();

        AbstarctFactory factory = new BlackThemeFactory();
        Button button = factory.createButton();
        button.click();

        Dialog dialog = factory.createDialog();
        dialog.tips();

        Menu menu = factory.createMenu();
        menu.dragger();
    }
}

我覺得的這樣代碼的擴展性太好了,具體的代碼 需要自己認認真真敲一遍,仔細體會面向抽象編程的好處和多態的意義;相關的demo連接如下:

http://download.csdn.net/download/yezhuandroid/10039409

(怎麼設置下載不用積分啊)

要注意這一點:

依賴倒置原則:
①不要讓一個變量指向一個具體的對象
②儘量不要覆蓋父類已有的實現 父類中定義的抽象方法 沒有實現,僅僅只是一個指針。

抽象工廠的優缺點是:

優點:
①向客戶隱藏了創建對象的細節
②工廠可以自主創建何種產品
③無需修改已有的東西
缺點:
①需要引入抽象層

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