簡單的舉個例子:好多遊戲都存在皮膚的概念,當你換皮膚的時候整個遊戲的風格比如按鈕、菜單、對話框等等 全部都替換了,再者,當新建一套新的皮膚的時候,要儘量做到無需修改已有的東西。在這一套皮膚中,這都是一系列的產品。如何能實現這樣效果?
工廠模式的概念:爲創建對象提供過度接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。
這是我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
(怎麼設置下載不用積分啊)
要注意這一點:
依賴倒置原則:
①不要讓一個變量指向一個具體的對象
②儘量不要覆蓋父類已有的實現 父類中定義的抽象方法 沒有實現,僅僅只是一個指針。
抽象工廠的優缺點是:
優點:
①向客戶隱藏了創建對象的細節
②工廠可以自主創建何種產品
③無需修改已有的東西
缺點:
①需要引入抽象層