数据库与工厂模式的思考

来源:互联网 发布:手机淘宝怎么关注降价 编辑:程序博客网 时间:2024/06/06 07:43

最近一直忙着硬件调试,闲来看看数据库和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;
}