合理設計代碼架構(設計模式之抽象工廠)
講到oo,學過幾年的人都會說,oo,我會。java生來就是oo的,我一直用java,自然也就oo了。oo簡單的時候也就幾個class就好了。但是複雜的時候,一個人寫幾個class完成一個項目,另外一個人也寫幾個class,但是reusability, flexibility的高下就分出來了。
舉個簡單的例子,要製作一個window,上面有button,scroll bar, status bar等等,這個window要支持不同的表現形式,比如說bitmap_window,這些button, scroll bar, status bar都可以load上自己畫好的圖片,更好看些。再比如說plain_window,上面都是些普通的button,scroll bar, status bar。
你會怎樣設計?
很簡單。
base class:
button
derived class:
bitmap_button, plain_button等等
base class:
scroll_bar
derived class
bitmap_scroll_bar, plain_scroll_bar
這樣設計看起來也確實不錯,你要create一個window,可以這樣
window mainwin = new bitmap_window
button button1 = new bitmap_button
button button2 = new bitmap_button
mainwin.add(button1)
mainwin.add(button2)
scroll_bar sbar = new bitmap_scroll_bar
mainwin.add(sbar)
你也許會說,這樣不挺好麼,但是,如果我要把整個窗口變成plain的呢?把整個窗口變成別的形式的呢?
search and replace, 把所有的bitmap換成plain。
window mainwin = new plain_window
button button1 = new plain_button
等等等
也許你說這樣也不會很麻煩啊,但是如果是一個很大的項目,button等等的東西基本上到處都要創建,修改起來是很麻煩也很容易出錯的。
這就牽扯到flexibility的問題了。
有好的解決辦法麼?有!design patterns之abstract factory.
abstract class BaseFactory
{
abstract public window createWindow();
abstract public button createButton();
abstract public scroll_bar createScrollBar();
//etc etc
}
class BitmapFactory : BaseFactory
{
public window createWindow { return new bitmap_window; }
public button createButton { return new bitmap_button; }
public scroll_bar createScrollbar { return new bitmap_s_bar;}
}
class PlainFactory : BaseFactory
{
public window createWindow { return new plain_window; }
public button createButton { return new plain_button; }
public scroll_bar createScrollbar { return new plain_s_bar;}
}
你也許會問,這些東西有什麼用?有!
BaseFactory factory = new BitmapFactory;
window mainWin = factory.createWindow();
button button1 = factory.createButton();
button button2 = factory.createButton();
window.add(button1);
window.add(button2);
如果你要改成plain的,只需要BaseFactory factory = new PlainFactory就ok了!
這樣做的好處是顯而易見的,首先,用戶不需要關心具體是bitmapwindow,plainwindow,還是什麼window, object creation和具體的code完全分離開,大大減少了dependancy。
其次,這樣做enforce了bitmap_button只能加在bitmap_window裏面。
還有一系列好處。我也就不重複了。有興趣的朋友請看這本書吧。
近10年來最重要的軟件開發書籍《設計模式》
舉個簡單的例子,要製作一個window,上面有button,scroll bar, status bar等等,這個window要支持不同的表現形式,比如說bitmap_window,這些button, scroll bar, status bar都可以load上自己畫好的圖片,更好看些。再比如說plain_window,上面都是些普通的button,scroll bar, status bar。
你會怎樣設計?
很簡單。
base class:
button
derived class:
bitmap_button, plain_button等等
base class:
scroll_bar
derived class
bitmap_scroll_bar, plain_scroll_bar
這樣設計看起來也確實不錯,你要create一個window,可以這樣
window mainwin = new bitmap_window
button button1 = new bitmap_button
button button2 = new bitmap_button
mainwin.add(button1)
mainwin.add(button2)
scroll_bar sbar = new bitmap_scroll_bar
mainwin.add(sbar)
你也許會說,這樣不挺好麼,但是,如果我要把整個窗口變成plain的呢?把整個窗口變成別的形式的呢?
search and replace, 把所有的bitmap換成plain。
window mainwin = new plain_window
button button1 = new plain_button
等等等
也許你說這樣也不會很麻煩啊,但是如果是一個很大的項目,button等等的東西基本上到處都要創建,修改起來是很麻煩也很容易出錯的。
這就牽扯到flexibility的問題了。
有好的解決辦法麼?有!design patterns之abstract factory.
abstract class BaseFactory
{
abstract public window createWindow();
abstract public button createButton();
abstract public scroll_bar createScrollBar();
//etc etc
}
class BitmapFactory : BaseFactory
{
public window createWindow { return new bitmap_window; }
public button createButton { return new bitmap_button; }
public scroll_bar createScrollbar { return new bitmap_s_bar;}
}
class PlainFactory : BaseFactory
{
public window createWindow { return new plain_window; }
public button createButton { return new plain_button; }
public scroll_bar createScrollbar { return new plain_s_bar;}
}
你也許會問,這些東西有什麼用?有!
BaseFactory factory = new BitmapFactory;
window mainWin = factory.createWindow();
button button1 = factory.createButton();
button button2 = factory.createButton();
window.add(button1);
window.add(button2);
如果你要改成plain的,只需要BaseFactory factory = new PlainFactory就ok了!
這樣做的好處是顯而易見的,首先,用戶不需要關心具體是bitmapwindow,plainwindow,還是什麼window, object creation和具體的code完全分離開,大大減少了dependancy。
其次,這樣做enforce了bitmap_button只能加在bitmap_window裏面。
還有一系列好處。我也就不重複了。有興趣的朋友請看這本書吧。
近10年來最重要的軟件開發書籍《設計模式》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.