合理设计代码架构(设计模式之抽象工厂)

讲到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年来最重要的软件开发书籍《设计模式》
 

你可能感兴趣的:(java,设计模式,button,scroll,class,oo,java)