抽象工厂

抽象工厂

简介

抽象工厂模式,是设计模式中最简单的一种应用,其根据C++多态与继承的特点,工厂模式依据虚类提供必要的公共接口,具体实现类根据接口进行具体实现,而相关类则直接根据虚基类的接口进行相关程序调用。

意图

提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类。

效果

抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中被解耦了。

效果

  1. 它分离了具体的类

  2. 它使得易于交换产品系列

  3. 有利于产品的一致性

  4. 难以支持新种类的产品

举例

数据库访问程序设计,不同的数据库访问方式可能不一样,为了抽象对不同数据库的访问,可以将数据库隐藏起来,提供统一的访问方式,用多态进行实现。

UML设计

编程实现

#include <iostream>
using namespace std;

IUser ~用户表结构~

class IUser{
public:
virtual void Insert() = 0;
virtual void GetUser() = 0;
}

SQL Server 数据库访问User表

class SQLServer:public IUser
{
public:
void Insert(){
  cout<<"SQL 给USer表插入一条记录"<<endl;
}
​
void GetUser(){
   cout<<"在SQL 中获取一条记录"<<endl;
}

Access 数据库访问User表

class AccessUser: public IUser
{
pubic:
    void Insert(){
    cout << "Access 给User表插入一条记录"<<endl;
    }
    void GetUser(){
    cout <<"Access 中获取一条记录"<<endl;  
    }
}

Department 表接口

class IDepartment
{
public:
    virtual void Insert() = 0;
    virtual void GetDepartment() = 0;
}

抽象工厂接口

class IFactory
{
public:
virtual IUser* CreateUser() = 0;
virtual IDepartment* CreateDepartment() = 0;
}

SQL Server 工厂实现

class SqlServerFactory:public IFactory
{
public:
    IUSer* CreateUser(){
        return new SqlServerUser();
    }
    IDepartment* CreateDepartment(){
        return new SqlServerDepartment();
    }
}

Access 工厂实现

class AccessFactory:public IFactory
{
public:
    IUser* CreateUser(){
        return new AccessUser();
    }
    IDepartment* CreateDepartment(){
        return new AccessDepartment();
    }
}

客户端代码

int main()
{
    ///  创建工厂
    IFactory* pFactory = nullptr;
    IUser* pUser = nullptr;
    IDepartment* pDepartment = nullptr;
    int choise;
    cout<<"选择数据库";
    cin>>choise;
    switch(choise){
    case 1:
        pFactory = new SqlServerFactory();
        break;
    case 2:
        pFactory = new AccessFactory();
        break;
    }
​
    /// 一致性操作
    pUser = pFactory->CreateUser();
    pDepartment = pFactory->CreateDepartment();
    pUser->Insert();
    pUser->GetUser();
    pDepartment->Insert();
    pDepartment->GetDepartment();
​
    return 0;
}

other

  1. 为了解决抽象工厂不够灵活的缺点,一种更灵活但不太安全的设计是给创建对象的操作增加一个参数,该参数可以是一个类标示符、一个整数、以这个字符串,或其他任何可以标示这种产品的东西。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值