Abstract Factory

本文通过一个未封装好的平台相关性的示例程序,展示了如何利用抽象工厂模式进行重构,以实现跨平台组件的一致创建。通过定义平台无关的组件类和工厂类,客户可以根据不同平台需求,调用相应的工厂创建特有组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果应用程序要适应不同平台的话,要封装那些对平台的依赖关系。如果不事先考虑好封装,程序中会出现很多#ifdef语句。
Abstract Factory模式,是用来代替new来创建那些相互之间有依赖关系的对象的。该模式把所有平台共同拥有的组件都找出来,然后一个个定义成平台无关的类,最后定义一个Factory,负责生成所有这些组件。客户在使用时,只需要使用该平台的Factory,就可以生成该平台独有的组件对象。

下面这个程序没有封装好平台相关性,所以看着很乱。

class Widget { public: virtual void draw() = 0; }; class MotifBtn : public Widget { public: void draw() { cout << "MotifBtn" << endl; } }; class WindowsBtn : public Widget { public: void draw() { cout << "WindowsBtn" << endl; } }; void doThisWindow() { // create window, attach btn #ifdef MOTIF Widget* w = new MotifBtn; #else // WINDOWS Widget* w = new WindowsBtn; #endif w->draw(); } void doThatWindow() { // create window, attach btn #ifdef MOTIF Widget* w = new MotifBtn; #else // WINDOWS Widget* w = new WindowsBtn; #endif w->draw(); } void main( void ) { // create window, attach btn #ifdef MOTIF Widget* w = new MotifBtn; #else // WINDOWS Widget* w = new WindowsBtn; #endif w->draw(); doThisWindow(); doThatWindow(); }

重构以后,成了下面这个样子:

// 这个Widget是平台无关的 class Widget { public: virtual void draw() = 0; }; class MotifBtn : public Widget { public: void draw() { cout << "MotifBtn" << endl; } }; class WindowsBtn : public Widget { public: void draw() { cout << "WindowsBtn" << endl; } }; // 这个Factory是平台无关的 class WidgetFactory { public: virtual Widget* makeBtn() = 0; static WidgetFactory* getInstance(); protected: WidgetFactory() {}; virtual ~WidgetFactory() {}; private: static WidgetFactory* s_widgetFactory; }; WidgetFactory* WidgetFactory::s_widgetFactory = NULL; class MotifFactory: public WidgetFactory { public: Widget* makeBtn() { return new MotifBtn; } }; class WindowsFactory: public WidgetFactory { public: Widget* makeBtn() { return new WindowsBtn; } }; // 基于Factory的特性,一般搞成Singleton WidgetFactory* WidgetFactory::getInstance() { if (s_widgetFactory == NULL) #ifdef MOTIF s_widgetFactory = new MotifFactory; #else // WINDOWS s_widgetFactory = new WindowsFactory; #endif return s_widgetFactory; } void doThisWindow() { Widget* widget = WidgetFactory::getInstance()->makeBtn(); widget->draw(); } void doThatWindow() { // create window, attach btn Widget* w = WidgetFactory::getInstance()->makeBtn(); w->draw(); } // 程序没有回收make出来的资源,故意为之 void main() { Widget* w = WidgetFactory::getInstance()->makeBtn(); w->draw(); doThisWindow(); doThatWindow(); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值