抽象ファクトリモードによるデータベース置換管理C++の実現


抽象ファクトリ・モードの理解を説明します.抽象ファクトリ・モードは、特定のクラスを指定することなく、関連オブジェクトまたは相互依存オブジェクトを作成するインタフェースを提供します.抽象工場の内部には、すべての製品を作成する抽象的な方法が含まれています.つまり、各工場は提供されたすべての製品を生産します.そのため、異なる製品には異なる工場で生産された異なる規格があります.彼の長所は:1.製品を簡単に交換できるシリーズ、ie、具体的な工場を交換することができます.彼は具体的な作成インスタンスプロセスとクライアントを分離させ、顧客は抽象インタフェースを通じてインスタンスの操作を実現し、製品の具体的なクラス名も具体的な工場分離によって実現され、顧客コードには現れない.
しかし、製品を追加する必要がある場合、具体的な工場を変更する必要があり、開閉原則に違反しているという欠点もある.
C#では,反射機構を用いて実現でき,単純な工場を用いてswitch,ifの論理判断を除去し,メンテナンスと拡張の問題を解決できることを紹介した.
UMLプログラム実行効果図:コードfactory.h
#ifndef _FACTORY_H_
#define _FACTORY_H_

#include "MainProduct.h"
#include <memory>

using std::shared_ptr;

/************************************************************************/
/*      */
/************************************************************************/
class CIFactory{
public:
 virtual shared_ptr<CIUser> createUser() = 0;
 virtual shared_ptr<CIDepartment> createDepartment() = 0;
};

#endif // _FACTORY_H_

mainfactory.h
#ifndef _MAINFACTORY_H_
#define _MAINFACTORY_H_

#include "Factory.h"
#include "MainProduct.h"

/************************************************************************/
/* sql    */
/************************************************************************/
class SqlFactory : public CIFactory{
public:
 shared_ptr<CIUser> createUser(){
 return shared_ptr<CIUser>(new SqlServerUser());
 }

 shared_ptr<CIDepartment> createDepartment(){
 return shared_ptr<CIDepartment>(new SqlServerDepartment());
 }
};

/************************************************************************/
/* access    */
/************************************************************************/
class AccessFactory : public CIFactory{
public:
 shared_ptr<CIUser> createUser(){
 return shared_ptr<CIUser>(new AccessUser());
 }

 shared_ptr<CIDepartment> createDepartment(){
 return shared_ptr<CIDepartment>(new AccessDepartment());
 }
};

#endif // _MAINFACTORY_H_

product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_

#include <string>

/************************************************************************/
/* user      */
/************************************************************************/
class User{
public:
    int Id() const { return _id; }
    void Id(int val) { _id = val; }
    std::string Name() const { return _name; }
    void Name(std::string val) { _name = val; }

private:
    int _id;    
    std::string _name;  
};

class CIUser{
public:
    virtual void Insert(User user) = 0;
    virtual User getUser(int id) const = 0;
};

/************************************************************************/
/* department      */
/************************************************************************/
class Department{
public:
    int Id() const { return _id; }
    void Id(int val) { _id = val; }
    std::string Name() const { return _name; }
    void Name(std::string val) { _name = val; }

private:
    int _id;
    std::string _name;
};

class CIDepartment{
public:
    virtual void Insert(Department department) = 0;
    virtual Department getDepartment(int id) const = 0;
};


#endif // _PRODUCT_H_

mainproduct.h
#ifndef _MAINPRODUCT_H_
#define _MAINPRODUCT_H_

#include "product.h"
#include <iostream>

using std::cout;
using std::endl;

/************************************************************************/
/* sql server user */
/************************************************************************/
class SqlServerUser : public CIUser{
public:
    void Insert(User user){
        cout << "sql server insert a record" << endl;
    }

    User getUser(int id) const{
        cout << "get user from sql server" << endl;
        return User();
    }
};

/************************************************************************/
/* Access user */
/************************************************************************/
class AccessUser : public CIUser{
public:
    void Insert(User user){
        cout << "access insert a record" << endl;
    }

    User getUser(int id) const{
        cout << "get user from access" << endl;
        return User();
    }
};

/************************************************************************/
/* sql server department */
/************************************************************************/
class SqlServerDepartment : public CIDepartment{
public:
    void Insert(Department user){
        cout << "sql server insert a record" << endl;
    }

    Department getDepartment(int id) const{
        cout << "get Department from sql server" << endl;
        return Department();
    }
};

/************************************************************************/
/* Access department */
/************************************************************************/
class AccessDepartment : public CIDepartment{
public:
    void Insert(Department user){
        cout << "access insert a record" << endl;
    }

    Department getDepartment(int id) const{
        cout << "get Department from access" << endl;
        return Department();
    }
};

#endif // _MAINPRODUCT_H_

main.cpp
#include "MainFactory.h"
#include "MainProduct.h"
#include <iostream>
#include <memory>

using namespace std;

int main(){
    shared_ptr<User> user(new User);
    shared_ptr<CIFactory> factory(new SqlFactory);
    shared_ptr<CIUser> iuser = factory->createUser();

    iuser->Insert(*user);
    iuser->getUser(1);

    system("pause");
    return 0;
}