设计模式C++实现——抽象工厂模式

模式定义:

        抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

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

模式结构:

举例:

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

UML设计:

编程实现及执行结果:

#include <iostream>
using namespace std;

    用户表接口

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

    SqlServer数据库访问User表

class SqlServerUser : public IUser
{
	public:
	void Insert()
	{
		cout<<"在SQL Server中给User表增加一条记录"<<endl;
	}
	void GetUser()
	{
		cout<<"在SQL Server中给User表获取一条记录"<<endl;
	}
};

    Access数据库访问User表

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

    Department表接口

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

    SqlServer数据库访问Department表

class SqlServerDepartment : public IDepartment
{
public:
	void Insert()
	{
		cout<<"在SQL Server中给Department表增加一条记录"<<endl;
	}
	void GetDepartment()
	{
		cout<<"在SQL Server中Department获取一条记录"<<endl;
	};
};

    Access数据库访问Department表

class AccessDepartment : public IDepartment
{
public:
	void Insert()
	{
		cout<<"在Access中给Department表增加一条记录"<<endl;
	}
	void GetDepartment()
	{
		cout<<"在Access中Department获取一条记录"<<endl;
	};
};

    抽象工厂接口

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

    SqlServer工厂实现

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

    Access工厂实现

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

    客户代码

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

	return 0;
}

        执行结果如下:

选择数据库: 2

在Access中给User表增加一条记录

在Access中User表获取一条记录

在Access中给Department表增加一条记录

在Access中Department获取一条记录

请按任意键继续. . .

设计原则的应用:

        设计原则4:为交互对象之间的耦合设计而努力

 

参考:http://baike.baidu.com/view/1580269.htm?fr=aladdin

           Head First 设计模式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中可以通过使用抽象和虚函数来实现抽工厂模式。抽象工厂模式是一种创建型设计模式,它提供了一种封装一组相关对象创建的方式,而无需指定具体的。 在C++中,可以通过以下步骤来实现抽象工厂模式: 1. 定义抽象基(Abstract Base Class):创建一个抽象基,该定义了一组纯虚函数,用于创建不同型的产品对象。 ```cpp class AbstractProduct { public: virtual void operation() = 0; }; ``` 2. 定义具体产品(Concrete Product Classes):创建一组具体产品,这些继承自抽象基,并实现其纯虚函数。 ```cpp class ConcreteProductA : public AbstractProduct { public: void operation() override { // 具体产品A的操作 } }; class ConcreteProductB : public AbstractProduct { public: void operation() override { // 具体产品B的操作 } }; ``` 3. 定义抽象工厂(Abstract Factory Class):创建一个抽象工厂,该定义了一组纯虚函数,用于创建不同型的产品对象。 ```cpp class AbstractFactory { public: virtual AbstractProduct* createProduct() = 0; }; ``` 4. 定义具体工厂(Concrete Factory Classes):创建一组具体工厂,这些继承自抽象工厂,并实现其纯虚函数。 ```cpp class ConcreteFactoryA : public AbstractFactory { public: AbstractProduct* createProduct() override { return new ConcreteProductA(); } }; class ConcreteFactoryB : public AbstractFactory { public: AbstractProduct* createProduct() override { return new ConcreteProductB(); } }; ``` 通过以上步骤,我们就可以使用抽象工厂模式来创建不同型的产品对象。具体使用时,可以根据需要选择具体的工厂来创建产品对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值