c++设计模式之抽象工厂模式

来源:互联网 发布:同步带选型计算软件 编辑:程序博客网 时间:2024/05/22 13:46
[cpp] view plaincopyprint?
  1. /************************************************************************/
  2. /* 抽象工厂模式 */
  3. /************************************************************************/
  4. /*
  5. 抽象工厂模式简介:一个工厂接口,多个产品接口
  6. 这里我们以数据库的维护为例,假设现在有一个工程项目不一定会用到
  7. Access和SqlServer这两种数据库的哪一种,但是此工程中数据库的相关表已经被定下
  8. 因为对Access和Sqlserver的操作并不相同,此时为了维护方便我们可以使用抽象工厂模式
  9. */
  10. /*
  11. 假如现在的工程中存在两个表User和Deparment
  12. */
  13. #include <IOSTREAM>
  14. using namespace std;
  15. /*用户*/
  16. class User
  17. {
  18. };
  19. /*部门*/
  20. class Department
  21. {
  22. };
  23. //定义User表的抽象接口
  24. class IUser
  25. {
  26. public:
  27. //向Iuser表中插入一个user
  28. virtual void Insert(User* user) = 0;
  29. virtual User* GetUser(int id) = 0;//根据id获取user
  30. };
  31. //Access中的User表(具体)
  32. class AccessUser :public IUser
  33. {
  34. public:
  35. void Insert(User *user)
  36. {
  37. cout<<"在Access数据库中的IUser表中插入一个User(记录)"<<endl;
  38. }
  39. User* GetUser(int id)
  40. {
  41. cout<<"从Access数据库的IUser表中根据id获取一条记录"<<endl;
  42. return NULL;
  43. }
  44. };
  45. class SqlserverUser :public IUser
  46. {
  47. public:
  48. void Insert(User *user)
  49. {
  50. cout<<"在Sqlserver数据库中的IUser表中插入一个User(记录)"<<endl;
  51. }
  52. User* GetUser(int id)
  53. {
  54. cout<<"从Sqlserver数据库的IUser表中根据id获取一条记录"<<endl;
  55. return NULL;
  56. }
  57. };
  58. //定义Deparment表的抽象接口
  59. class IDepartment
  60. {
  61. public:
  62. virtual void Insert(Department *department) = 0;
  63. virtual Department *GetDepartment(int id) = 0;
  64. };
  65. //Access 数据库中的Department表
  66. class AccessDepartment :public IDepartment
  67. {
  68. public:
  69. void Insert(Department* department)
  70. {
  71. cout<<"在Access数据库的IDepartment表中插入一条记录"<<endl;
  72. }
  73. Department* GetDepartment(int id)
  74. {
  75. cout<<"从Access数据库的IDepartment表根据id获取一条记录"<<endl;
  76. return NULL;
  77. }
  78. };
  79. //Sqlserver数据库中的Department表
  80. class SqlserverDepartment : public IDepartment
  81. {
  82. public:
  83. void Insert(Department* department)
  84. {
  85. cout<<"在Sqlserver数据库的IDepartment表中插入一条记录"<<endl;
  86. }
  87. Department* GetDepartment(int id)
  88. {
  89. cout<<"从Sqlserver数据库的IDepartment表根据id获取一条记录"<<endl;
  90. return NULL;
  91. }
  92. };
  93. //工厂接口
  94. class IFactory
  95. {
  96. public:
  97. virtual IUser * CreateUser() = 0;
  98. virtual IDepartment *CreateDepartment() = 0;
  99. };
  100. //Access工厂类
  101. class AccessFactory : public IFactory
  102. {
  103. public:
  104. IUser* CreateUser()
  105. {
  106. return new AccessUser();
  107. }
  108. IDepartment* CreateDepartment()
  109. {
  110. return new AccessDepartment();
  111. }
  112. };
  113. //sqlserver工厂类
  114. class SqlserverFactory : public IFactory
  115. {
  116. public:
  117. IUser* CreateUser()
  118. {
  119. return new SqlserverUser();
  120. }
  121. IDepartment* CreateDepartment()
  122. {
  123. return new SqlserverDepartment();
  124. }
  125. };
  126. void main()
  127. {
  128. //建立一个Access工厂
  129. IFactory *sqlserverFactory = new SqlserverFactory();
  130. IUser *user = sqlserverFactory->CreateUser();
  131. user->Insert(new User());
  132. user->GetUser(0);
  133. /*使用这种设计模式的好处是,
  134. 1.当你需要更换数据库或时只需要更改一个地方
  135. 2.当你需要对其他表进行操作时也只需要改一个地方
  136. 可维护性大大提高
  137. */
  138. }


运行结构:

原创粉丝点击