技术开发 频道

浅析设计模式之抽象工厂模式

二、抽象工厂模式的使用场景 

    今天要谈的抽象工厂模式属于对象创建型模式。 

    创建型模式抽象了对象实例化的过程,它帮助系统不依赖于对象如何创建,如何实现,何时创建。个类创建型模式使用继承使对象创建多样化,一个对象创建模式将对象的创建代理到其他类。 

    那抽象工厂模式是为了解决什么问题的呢?给了我们怎样的设计思路?在软件开发中我们经常会碰到一系列相关的对象需要创建,如果按照常规做法我们就要为不同的对象创建编写不同的代码,复用性和可维护性都降低了。而且这些相关对象创建的方式也许不同,那么客户代码创建的时候就要针对不同的对象编码,对象创建的方式还是一个容易改变的地方。基于这样的情况提出了抽象工厂模式,抽象工厂模式为创建一系列相关对象提供了统一的接口,客户只要调用这个接口即可,封装了变化,隔离了变化,让客户代码稳定起来。 

    比如这样一个情况,我们做了一个桌面软件,这个软件的界面是可以改变的,它有几种风格:XP风格、Win2000风格、苹果机风格。 

    这个软件就是显示一个窗口,窗口有标题栏、滚动条,XP风格的界面有它自己的标题栏和滚动条,而苹果机风格的又不一样。 

    我们常常怎么做?

switch(type) { case "XP" : setTitle(new XPTitle()); setScrollbar(new XPScrollbar()); break; case "win2000" : setTitle(new win2000Title()); setScrollbar(new win2000Scrollbar()); break; case "macos" : setTitle(new macosTitle()); setScrollbar(new macosScrollbar()); break; }

    这样做有什么坏处呢,这个例子太小实际上没有什么坏处,这样写可以。但是人总会出错,有一次你这样写了:

case "win2000" : setTitle(new win2000Title()); setScrollbar(new XPScrollbar()); break;

 

    你的界面将是Win2000的标题栏,XP风格的滚动条,这就造成了不一致性抽象工厂就是为了解决这种一系列相关对象创建工作的。


图1:抽象工厂的类图

    在上面这个例子中标题栏和滚动条都是我们的产品,我们还应该写一个WindowManager类,专门来管理这些产品的创建的,而我们的WinXP团队、Win2000团队、苹果机团队实现这个WindowManager,WinXP团队只会制造出XP风格的产品。

0
相关文章