最近一直忙着硬件调试,闲来看看数据库和JDBC的诸多知识,不禁大有所得,昨日偶得工厂模式,即详考之。
一、引言
首先需要明确为什么建立多态机制?多态机制是为了使得大部分代码尽可能少的了解对象的具体类型,而是只与对象家族中的一个通用表示打交道。这样就使得代码更容易读写和维护,所以“多态”是面向对象编程的基本目标。
二、抽象工厂
2.1 什么是抽象工厂?
当我们需要建造栋大楼时,常常是需要遵循图纸工作的。在抽象工厂中我们就将图纸作为一个类族独立出来,构成一组具有相互继承关系的工厂。其中,基类工厂定义了构造的“大楼”的基本框架,子类工厂定义了框架的具体实现。在构建大楼时,通过“多态”技术,调用子类工厂的相关方法,就可以实现同一样式族中各个部件。
2.2 抽象工厂实现
本实现想要构建一组生成统一样式窗体的抽象工厂。窗体中有两个组件:Window和ScrollBar。每种组件有两种样式:Motif和PM。
1、传统的方法
我们可能容易想到的通过函数参数来确定样式。
class Factory
{
public:
MotifWindow createMotifWindow();
}
这样做有一个坏处,使得用户代码可以访问到图纸的具体实现,增加了代码的耦合性,没有一组通用的接口。
2、抽象工厂的方法
//抽象工厂接口,定义通用性
class WidgetFactory
{
public:
virtual Window *CreateWindow() //多态方法
{
return new Window();
}
virtual ScrollBar *CreateScrollBar()
{
return new ScrollBar();
}
};
//工厂实现No.1
class MotifWidgetFactory : public WidgetFactory
{
public:
virtual Window *CreateWindow()
{
return new MotifWindow();
}
virtual ScrollBar *CreateScrollBar()
{
return new MotifScrollBar();
}
};
//工厂实现No.2
class PMWidgetFactory : public WidgetFactory
{
public:
virtual Window *CreateWindow()
{
return new PMWindow();
}
virtual ScrollBar *CreateScrollBar()
{
return new PMScrollBar();
}
};
//窗口组件
class Window
{
public:
Window()
{
// cout << "Constructing a window" << endl;
}
};
class MotifWindow : public Window
{
public:
MotifWindow()
{
cout << "Constructing a motifwindow" << endl;
}
};
class PMWindow : public Window
{
public:
PMWindow()
{
cout << "Constructing a pmwindow" << endl;
}
};
//ScrollBar组件
class ScrollBar
{
public:
ScrollBar()
{
// cout << "Constructing a ScrollBar" << endl;
}
};
class MotifScrollBar : public ScrollBar
{
public:
MotifScrollBar()
{
cout << "Constructing a motifScrollBar" << endl;
}
};
class PMScrollBar : public ScrollBar
{
public:
PMScrollBar()
{
cout << "Constructing a pmScrollBar" << endl;
}
};
//测试程序
int _tmain(int argc, _TCHAR* argv[])
{
WidgetFactory *factory = new MotifWidgetFactory(); //动态绑定,指针
factory->CreateWindow();
factory->CreateScrollBar();
system("pause");
return 0;
}