15 大话设计模式C++实现之抽象工厂模式

/*
抽象工厂模式:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
*/

/*
实例:不同客户的数据库管理采用不同的数据库完成,不同的数据库在语法上存在差异,因此需要
解除用户和具体数据库之间的耦合(即业务逻辑与数据访问的解耦),避免向不同类型的客户提供支持时的代码复用
*/

#include<iostream>
#include<string>

using namespace std;

//IDepartment接口,用于客户端访问,解除与具体数据库的访问的耦合
class IDepartment
{
public:
    virtual void Insert(IDepartment* department) = 0;
    virtual IDepartment* GetDepartment(int id) = 0;
};

//SqlseverDepartment类,用于访问SQL sever的Department
class SqlServerDepartment : public IDepartment
{
public:
    virtual void Insert(IDepartment* department)
    {
        cout << "在SQL Server中给Department增加一条记录" << endl;
    }
    IDepartment* GetDepartment(int id)
    {
        cout << "在SQL Server中根据ID得到的Department记录" << endl;
        return NULL;
    }
};

//AccessDepartment类,用于访问Access的Department
class AccessDepartment : public IDepartment
{
public:
    virtual void Insert(IDepartment* department)
    {
        cout << "在Access中给Department表增加一条记录" << endl;
    }
    virtual IDepartment* GetDepartment(int id)
    {
        cout << "在Access中根据ID得到Department表一条记录" << endl;
        return NULL;
    }
};

//IUer接口,用于客户端访问,解除与具体数据库访问的耦合
class IUser
{
public:
    virtual void Insert(IUser* user) = 0;
    virtual IUser* GetUser(int id) = 0;
};

class  SqlseverUser : public IUser
{
public:
    virtual void Insert(IUser* user)
    {
        cout << "在SQL中给User增加一条记录!" << endl;
    }
    virtual IUser* GetUser(int id)
    {
        IUser *sq = new SqlseverUser;
        return sq;
    }
};

class AccessUser : public IUser
{
public:
    AccessUser()
    {
        cout << "AccessUser构造函数" << endl;
    }
    virtual void Insert(IUser* user)
    {
        cout << "在ACESS中给User增加一条记录!" << endl;
    }
    virtual IUser* GetUser(int id)
    {
        cout << "在ACESS中根据ID得到一条user表记录" << endl;
        IUser *sa = new AccessUser;
        return sa;
    }
};


//定义工厂类接口
//工厂方法模式是定义一个用于创建对象的接口,让子类决定具体实例化哪一个对象,可以利用父类指针指向子类对象
class IFactory
{
public:
    virtual IUser* CreateUser() = 0;
    virtual IDepartment* CreateDepartment() = 0;
};

class SqlseverFactory : public IFactory
{
public:
    virtual IUser* CreateUser()
    {
        return new SqlseverUser;
    }
    virtual IDepartment* CreateDepartment()
    {
        return new SqlServerDepartment;
    }
};

class AccessFactory : public IFactory
{
public:
    AccessFactory()
    {
        cout << "创建accessfactory对象" << endl;
    }
    virtual IUser* CreateUser()
    {
        cout << "创建AccessUser对象" << endl;
        return new AccessUser;
    }
    virtual IDepartment* CreateDepartment()
    {
        cout << "创建AccessDepartment对象" << endl;
        return new AccessDepartment;
    }
};

void Client()
{
    IUser *user = NULL;
    IDepartment * dept = NULL;
    IFactory *fac = new AccessFactory();
    IUser *iu = fac->CreateUser();  //iu指向accessuser对象
    iu->Insert(user);
    iu->GetUser(1);

    IDepartment *id = fac->CreateDepartment();
    id->Insert(dept);
    id->GetDepartment(1);
    if (iu != NULL)
    {
        free(iu);
        iu = NULL;
    }
    if (fac != NULL)
    {
        free(fac);
        fac = NULL;
    }
}

int main()
{
    Client();
    system("pause");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值