zoukankan      html  css  js  c++  java
  • 《大话设计模式》c++实现 抽象工厂模式

     

    为了更清晰地理解工厂方法模式,需要先引入两个概念:

    • 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
    • 产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

    抽象工厂模式包含如下角色:

    • AbstractFactory:抽象工厂
    • ConcreteFactory:具体工厂
    • AbstractProduct:抽象产品
    • Product:具体产品

    ../_images/AbatractFactory.jpg

    在上例中,产品族包括两个:1和2,也就是Sqlserver数据库和Access数据库。

    每个产品族里面又包含两类产品:A和B,也就是User表和Department表。

    而每个产品族中的产品要一起使用,就是说产品族1中的两类产品A和B要一起使用,也就是说在SqlServer数据库中SqlServerUser表和SqlServerDepartment表要一起使用,Access数据库同理。

    工厂角度:

    SqlFactory:

      User:

        //具体产品A1 SqlProductA

      Department:

        //具体产品B1 SqlProductB
     AccessFactory:

      User:    

        //具体产品A2 AccessProductA

      Department:

        //具体产品B2 AccessProductB

     产品角度:

    AbstractProductA(user 表):

      //具体产品A1 SqlProductA

      //具体产品A2 AccessProductA

    AbstractProductB(Department表)

      

        //具体产品B1 SqlProductA

      //具体产品B2 AccessProductA

      1 #include<string>
      2 #include<iostream>
      3 
      4 
      5 
      6 //数据库表项:User  与工厂模式无关
      7 class User
      8 {
      9 private:
     10     int id;
     11     std::string name;
     12 public:
     13     int getID()
     14     {
     15         return id;
     16     }
     17     std::string getName()
     18     {
     19         return name;
     20     }
     21     void setID(int ID)
     22     {
     23         this->id = ID;
     24     }
     25     void setName(std::string NAME)
     26     {
     27         this->name = NAME;
     28     }
     29 };
     30 
     31 
     32 //数据库表项:Department 与工厂模式无关
     33 class Department
     34 {
     35 private:
     36     int id;
     37     std::string name;
     38 public:
     39     int getID()
     40     {
     41         return id;
     42     }
     43     std::string getName()
     44     {
     45         return name;
     46     }
     47     void setID(int ID)
     48     {
     49         this->id = ID;
     50     }
     51     void setName(std::string NAME)
     52     {
     53         this->name = NAME;
     54     }
     55 };
     56 
     57 
     58 
     59 
     60 //抽象产品A:IUser
     61 class AbstractProductA{
     62 public:
     63     virtual void  Insert(User user) = 0;
     64     virtual User* GetUser(int id) = 0;
     65 };
     66 
     67 //具体产品A1 SqlProductA
     68 class SqlProductA :public AbstractProductA{
     69 public:
     70     void  Insert(User user){
     71         std::cout << "在SQL Server中给User表增加了一条记录" << std::endl;
     72     }
     73     User*  GetUser(int id){
     74         std::cout << "在SQL Server中得到id为:"<<id<<" User表一条记录" << std::endl;
     75         return NULL;
     76     }
     77 };
     78 //具体产品A2 AccessProductA
     79 class AccessProductA :public AbstractProductA{
     80 public:
     81     void  Insert(User user){
     82         std::cout << "在Access中给User表增加了一条记录" << std::endl;
     83     }
     84     User*  GetUser(int id){
     85         std::cout << "在Access中得到id为:" << id << " User表一条记录" << std::endl;
     86         return NULL;
     87     }
     88 };
     89 
     90 //抽象产品B:IDepartment
     91 class AbstractProductB{
     92 public:
     93     virtual void  Insert(Department department) = 0;
     94     virtual  Department* GetDepartment(int id) = 0;
     95 };
     96 
     97 
     98 //具体产品B1 SqlProductB
     99 class SqlProductB :public AbstractProductB{
    100 public:
    101     void  Insert(Department department){
    102         std::cout << "在SQL Server中给department表增加了一条记录" << std::endl;
    103     }
    104      Department* GetDepartment(int id){
    105         std::cout << "在SQL Server中得到id为:" << id << " Department表一条记录" << std::endl;
    106         return NULL;
    107      }
    108 };
    109 
    110 
    111 //具体产品B2 AccessProductB
    112 class AccessProductB :public AbstractProductB{
    113 public:
    114     void  Insert(Department department){
    115         std::cout << "在Access中给department表增加了一条记录" << std::endl;
    116     }
    117     Department*  GetDepartment(int id){
    118         std::cout << "在Access中得到id为:" << id << " Department表一条记录" << std::endl;
    119         return NULL;
    120     }
    121 };
    122 
    123 
    124 class AbstractFactory{
    125 public:
    126     virtual AbstractProductA* createProductA() = 0;
    127     virtual AbstractProductB* createProductB() = 0;
    128 };
    129 
    130 //具体工厂1:SqlServerFactory
    131 class SqlFactory :public AbstractFactory
    132 {
    133 public:
    134     AbstractProductA* createProductA()
    135     {
    136         return new SqlProductA;
    137     }
    138     AbstractProductB* createProductB()
    139     {
    140         return new SqlProductB;
    141     }
    142 };
    143 
    144 //具体工厂2:AccessFactory
    145 class AccessFactory :public AbstractFactory{
    146 public:
    147     AbstractProductA* createProductA()
    148     {
    149         return new AccessProductA;
    150     }
    151     AbstractProductB* createProductB()
    152     {
    153         return new AccessProductB;
    154 
    155     }
    156 };
    157 
    158 
    159 void main()
    160 {
    161     //初始化数据库
    162     User user;
    163     Department department;
    164 
    165     //ConcreteFactory1
    166     AbstractFactory* factory = NULL;
    167     //factory = new SqlFactory;
    168     factory = new AccessFactory;
    169     //ProductA1
    170     AbstractProductA* iu = NULL;
    171     iu = factory->createProductA();
    172     iu->Insert(user);
    173     iu->GetUser(1);
    174 
    175     //ProductB1
    176     AbstractProductB* id = NULL;
    177     id = factory->createProductB();
    178     id->Insert(department);
    179     id->GetDepartment(1);
    180 
    181     if (factory != NULL)
    182     {
    183         delete factory;
    184         factory = NULL;
    185     }
    186     if (iu != NULL)
    187     {
    188         delete iu;
    189         iu = NULL;
    190     }
    191     if (id != NULL)
    192     {
    193         delete id;
    194         id = NULL;
    195     }
    196 
    197     system("pause");
    198 
    199     
    200 
    201 }

    https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html

    https://blog.csdn.net/xiqingnian/article/details/41181995

  • 相关阅读:
    error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
    E: 无法获得锁 /var/lib/apt/lists/lock
    卸载nginx
    服务器文件传输
    一些重要的sql命令
    设置某个字段的值是唯一的
    mysql注释的方法
    认证 (authentication) 和授权 (authorization) 的区别
    neutron_lib: 一个进程内的发布与订阅
    人工智能导论作业
  • 原文地址:https://www.cnblogs.com/zle1992/p/10162698.html
Copyright © 2011-2022 走看看