设计模式 Design Parttern ——抽象工厂Abstract Factory http://blog.youkuaiyun.com/leeidea 1:头文件 #ifndef _ABSTRCT_FACTORY_H_VANEY_ #define _ABSTRCT_FACTORY_H_VANEY_ #include <iostream> using namespace std; /****************************************************************** 名称 :AbstractFactory.h 版本 :1.00 描述 :演示抽象工厂类的概念 作者 :vaney.li@gmail.com http://blog.youkuaiyun.com/leeidea 日期 :2010年10月13日 版权 :vaney.li@gmail.com http://blog.youkuaiyun.com/leeidea ******************************************************************/ /* 官方解释:The purpose of the Abstract Factory is to provide an interface for creating families of related objects without specifying concrete classes. 我的理解:工厂就是一些函数接口的集合,不同的工厂有不同的方法,但如果要使用抽象工厂模式, 需要找到这些工厂的共同点,即在接口上做文章,让各个工厂的接口名称相同,这样就 可以统一接口,在C++中就为这些工厂抽象出一个基类即:抽象工厂类。 我的应用:用途很广,可以用在任何程序模块架构中。如为不同的模块可以看作不同的工厂,注意 要保持各个模块间有相同的接口。调用模块的时候就直接通过抽象工厂创建。 */ //抽象工厂中需要处理事务的抽象基类 class CDataBaseHelper { public: CDataBaseHelper() { cout << "CDataBaseHelper()" << endl; } virtual ~CDataBaseHelper() { cout << "~CDataBaseHelper()" << endl; } public: virtual int Insert(int data) = 0; virtual int find(int index) = 0; }; //处理事务的具体类 class CHelperSQL : public CDataBaseHelper { public: CHelperSQL() { cout << "CHelperSQL()" << endl; } virtual ~CHelperSQL() { cout << "~CHelperSQL()" << endl; } public: virtual int Insert(int data) { cout << "CHelperSQL Insert" << endl; return 1; } virtual int find(int index) { cout << "CHelperSQL Insert" << endl; return 1; } }; //处理事务的具体类 class CHelperAccess : public CDataBaseHelper { public: CHelperAccess() { cout << "CHelperAccess()" << endl; } virtual ~CHelperAccess() { cout << "~CHelperAccess()" << endl; } public: virtual int Insert(int data) { cout << "CHelperAccess Insert" << endl; return 1; } virtual int find(int index) { cout << "CHelperAccess Insert" << endl; return 1; } }; //抽象工厂类 class CAbstractFactory { public: CAbstractFactory() { cout << "CAbstractFactory()" << endl; } virtual ~CAbstractFactory() { cout << "~CAbstractFactory()" << endl; } public: virtual CDataBaseHelper* GetHelper() = 0; }; //具体工厂 class CFactorySQL : public CAbstractFactory { public: CFactorySQL() { cout << "CFactorySQL()" << endl; } virtual ~CFactorySQL() { cout << "~CFactorySQL()" << endl; } public: virtual CDataBaseHelper* GetHelper() { cout << "get CHelperSQL helper" << endl; return new CHelperSQL(); } }; //具体工厂 class CFactoryAccess : public CAbstractFactory { public: CFactoryAccess() { cout << "CFactoryAccess()" << endl; } virtual ~CFactoryAccess() { cout << "~CFactoryAccess()" << endl; } public: virtual CDataBaseHelper* GetHelper() { cout << "get CHelperAccess helper" << endl; return new CHelperAccess(); } }; #define VANEY_API //用户 extern "C" VANEY_API int UsingAB(); #endif 2:源文件 #include "AbstractFactory.h" VANEY_API int UsingAB() { /* 使用SQL工厂 */ CAbstractFactory* factorySQL = new CFactorySQL(); CDataBaseHelper* helperSQL = factorySQL->GetHelper(); helperSQL->find(10); helperSQL->Insert(10); /* 使用Access工厂 */ CAbstractFactory* factoryAccess = new CFactoryAccess(); CDataBaseHelper* helperAccess = factoryAccess->GetHelper(); helperAccess->find(10); helperAccess->Insert(10); return 1; } 3:用户文件main.c extern int UsingAB(); //系统默认入口 int _tmain(int argc, _TCHAR* argv[]) { return UsingAB(); }