设计模式C++实现十一:抽象工厂模式

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

优点:便于交换产品系统,由于具体工厂类,在一个应用中只需要初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可以使用不同的产品配置。它让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操作实例,产品的具体类名也被具体工厂实现分离,不会出现在客户端代码中。

#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H
#include<iostream>
#include<string>
using namespace std;

class IDepartment
{
	int id;
	string depname;
public:
	virtual void Insert(IDepartment * dp)=0;
	virtual IDepartment * GetDepartment(int id)=0;
};

class SqlserverDepartment :public IDepartment
{
public:
	void Insert(IDepartment * dp) ;
	IDepartment * GetDepartment(int id) ;
};

void SqlserverDepartment::Insert(IDepartment * dp)
{
	cout << "在SQL Server 中给Department表增加一条记录。\n";
}
IDepartment * SqlserverDepartment::GetDepartment(int id)
{
	cout << "在SQL Server 中根据ID得到Department表的一条记录。\n";
	return NULL;
}
class AccessDepartment :public IDepartment
{
public:
	void Insert(IDepartment * dp);
	IDepartment * GetDepartment(int id);
};
void AccessDepartment::Insert(IDepartment * dp)
{
	cout << "在Access 中给Department表增加一条记录。\n";
}
IDepartment * AccessDepartment::GetDepartment(int id)
{
	cout << "在Access 中根据ID得到Department表的一条记录。\n";
	return NULL;
}
class IUser
{
public:
	virtual void Insert(IUser *) = 0;
	virtual IUser * GetUser(int id) = 0;
};
class SqlserverUser :public IUser
{
public:
	void Insert(IUser *);
	IUser * GetUser(int id);
};
void SqlserverUser::Insert(IUser * in)
{
	cout << "在SQL Server中给User表增加一条记录。\n";
}

IUser * SqlserverUser::GetUser(int id)
{
	cout << "在SQL Server 中根据ID得到User表中的一条记录。\n";
	return NULL;
}

class AccessUser :public IUser
{
public:
	void Insert(IUser *);
	IUser * GetUser(int id);
};
void AccessUser::Insert(IUser * in)
{
	cout << "在Access给User表增加一条记录。\n";
}

IUser * AccessUser::GetUser(int id)
{
	cout << "在Access中根据ID得到User表中的一条记录。\n";
	return NULL;
}
class IFactory
{
public:
	virtual IUser * CreateUser() = 0;
	virtual IDepartment * CreateDepartment() = 0;
};

class SqlserverFactory :public IFactory
{
public:
	IUser * CreateUser();
	IDepartment * CreateDepartment();
};
IUser * SqlserverFactory::CreateUser()
{
	return new SqlserverUser;
}
IDepartment * SqlserverFactory::CreateDepartment()
{
	return new SqlserverDepartment;
}
class AccessFactory :public IFactory
{
public:
	IUser * CreateUser();
	IDepartment * CreateDepartment();
};
IUser * AccessFactory::CreateUser()
{
	return new AccessUser;
}
IDepartment * AccessFactory::CreateDepartment()
{
	return new AccessDepartment;
}
#endif
#include"AbstractFactory.h"
int main()
{
	IUser * userI = new SqlserverUser;
	IDepartment * dptI = new SqlserverDepartment;

	IFactory * factory = new SqlserverFactory;

	IUser * user = factory->CreateUser();
	//IDepartment * dpt = factory->CreateDepartment();
	user->Insert(userI);
	user->GetUser(1);

	IDepartment * dpt = factory->CreateDepartment();
	dpt->Insert(dptI);
	dpt->GetDepartment(1);

	IDepartment * AdptI = new AccessDepartment;

	IFactory * Afactory = new AccessFactory;
	IDepartment * IDf=Afactory->CreateDepartment();
	IDf->Insert(AdptI);
	IDf->GetDepartment(1);

	IUser *AuserI = new AccessUser;
	IUser * AUf = Afactory->CreateUser();
	AUf->Insert(AuserI);
	AUf->GetUser(1);
	return 0;
}
时间: 2024-11-08 15:38:54

设计模式C++实现十一:抽象工厂模式的相关文章

设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(熟悉的new操作符),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂

设计模式(三)——抽象工厂模式

设计模式(三)--抽象工厂模式 一.抽象工厂模式 1.抽象工厂模式简介 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. UML类图: 2.抽象工厂模式角色 (1)抽象工厂AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现 (2)具体工厂:包括具体工厂FactoryM和具体工厂FactoryN.具体工厂FactoryM用于生产具体产品MProductA和具体产品M

设计模式(3)抽象工厂模式(Abstract Factory)

设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂模式一般的书面定义为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 提供创建接口,无需指定具体实现类,这个原则在简单工厂模式和工厂方法模式篇已经反复讲到了,这是面向接口编程的一个基本准则,很显然,从抽象工厂模式的一般定义中可以看出这也是抽象工厂模式的一个核心,而抽象工厂模式的另

设计模式之创建型抽象工厂模式

通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责某一类产品的实例.抽象类是一种声明但不能使用的类,当你使用的时候就会报错.JavaScript中的抽象类不能像传统面向对象语言那样轻松地创建,我们可以在类的方法中手动抛出错误来模拟抽象类.你可能会想,这样的类什么都不能做有什么用?其实它在继承上是很有用的.抽象工厂模式不能用来创建具体对象,一般用它作为父类创建一些子类. // 抽象工厂方法 var PageFactory = function(parent, child) { // 判断抽象

设计模式(二)抽象工厂模式

抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类.每个生成的工厂都能按照工厂模式提供对象. 介绍 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品有多于一个的产品族,而系统只消费其

【设计模式】1、抽象工厂模式

对于这个抽象工厂的相应的代码实现 /** * 功能:抽象工厂模式的作用 适用性 1.一个系统要独立于它的产品的创建.组合和表示时. 2.一个系统要由多个产品系列中的一个来配置时. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现时. * 时间:2016年2月11日22:18 * 作者:cutter_point */ package com.shejimoshi.create.AbstractFactory; public in

设计模式(三)---抽象工厂模式

1. 简介:为创建一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类.抽象工厂模式通常是用于创创建一族产品,并且这族产品分不同的等级:不同的具体工厂类生产不同等级的一族产品. 2. 抽象工厂UML图 3.抽象工厂示意性类图 4.类图分析 从上图可以看出,抽象工厂模式涉及到以下四个角色 4.1:抽象工厂:担任这个角色的是工厂方法模式的核心,它与应用无关,任何在模式中创建对象的工厂都必须实现这个接口,在实际应用中,这个角色由java抽象类或接口来实现 4.2:具体工厂:担任这个角色的是抽象工

Java设计模式菜鸟系列(五)抽象工厂模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403 抽象工厂模式(Abstract Factory):抽象工厂--顾名思义,就是把工厂抽象出来,不同的工厂生产不同的产品.这样做有个好处:一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码. 一.uml建模图: 二.代码实现 /** * 示例:抽象工厂--顾名思义,就是把工厂抽象出来,不同的工厂生产不同的产品 * * 优点:一旦需要增加新的功能,直接增加新的

PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同属于同一个产品族的产品可以使用. 产品族:位于不同产品等级结构中,功能相关联的产品组成的家族.下面例子的 汽车和空调就是两个产品树, 奔驰C200+格力某型号空调就是一个产品族, 同理, 奥迪A4+海尔某型号空调也是一个产品族. 二.类图 三.抽象工厂模式的组成 抽象工厂(AbstractFacto

设计模式(六)抽象工厂模式

一.应用背景 还是以宝马汽车制造为例. 随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件.于是这个工厂开始生产空调和发动机,用来组装汽车.这时候工厂有两个系列的产品:空调和发动机.宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机. 二.具体例子: 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.比如宝马320系列使用空调型号A和发动机型号A,而宝马230系列使用空调型号B和发动机型号B,那么使用抽象工厂模式,在为32