合理設計代碼架構(設計模式之抽象工廠)

講到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年來最重要的軟件開發書籍《設計模式》
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章