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