大话设计模式C++实现-第15章-抽象工厂模式

一、UML图

二、概念

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

三、包括的角色

(1)抽象工厂

(2)详细工厂:包含详细工厂1和详细工厂2。详细工厂1用于生产详细产品A1和详细产品B1,详细工厂2用于生产详细产品A2和详细产品B2;

(3)抽象产品:包含抽象产品A和抽象产品B。

(4)详细产品:包含抽象产品A所相应的详细产品A1和A2。以及抽象产品B所相应的详细产品B1和B2.

说明:在《大话设计模式》中,上述的1和2分别代表Sqlserver数据库和Access数据库。上述的A和B分别代表数据库中的User表和Department表。

四、优势

(1)抽象工厂模式是对工厂方法模式的改进。

用于处理产品不仅仅有一类的情况(工厂方法模式下。产品仅仅有User这一类,而抽象工厂模式下。产品包含User和Department两类)。

(2)在下面情况下应当考虑使用抽象工厂模式:

  • 一个系统不应当依赖于产品类实例怎样被创建、组合和表达的细节,这对于全部形态的工厂模式都是重要的。
  • 这个系统有多于一个的产品族。而系统仅仅消费当中某一产品族。
  • 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,全部的产品以相同的接口出现,从而使client不依赖于实现。

(3)解读:

在上例中。产品族包括两个:1和2,也就是Sqlserver数据库和Access数据库。

每一个产品族里面又包括两类产品:A和B,也就是User表和Department表。而每一个产品族中的产品要一起使用,就是说产品族1中的两类产品A和B要一起使用,也就是说在SqlServer数据库中SqlServerUser表和SqlServerDepartment表要一起使用,Access数据库同理。

五、C++实现

(1)代码

#include <iostream>
#include <cstdlib>

using namespace std;

//数据库表项:User
class User
{
private:
	int id;
	string name;
public:
	int getID()
	{
		return id;
	}
	string getName()
	{
		return name;
	}
	void setID(int ID)
	{
		this->id=ID;
	}
	void setName(string NAME)
	{
		this->name=NAME;
	}
};

//数据库表项:Department
class Department
{
private:
	int id;
	string name;
public:
	int getID()
	{
		return id;
	}
	string getName()
	{
		return name;
	}
	void setID(int ID)
	{
		this->id=ID;
	}
	void setName(string NAME)
	{
		this->name=NAME;
	}
};

//抽象产品A:IUser
class IUser
{
public:
	virtual void Insert(User user)=0;
	virtual User* GetUser(int id)=0;
};
//详细产品A1:SqlserverUser
class SqlserverUser:public IUser
{
public:
	void Insert(User user)
	{
		cout<<"在SQL Server中给User表添加了一条记录"<<endl;
	}
	User* GetUser(int id)
	{
		cout<<"在SQL Server中依据ID得到User表一条记录"<<endl;
		return NULL;
	}
};
//详细产品A2:AccessUser
class AccessUser:public IUser
{
public:
	void Insert(User user)
	{
		cout<<"在Access中给User表添加了一条记录"<<endl;
	}
	User* GetUser(int id)
	{
		cout<<"在Access中依据ID得到User表一条记录"<<endl;
		return NULL;
	}
};

//抽象产品B:IDepartment
class IDepartment
{
public:
	virtual void Insert(Department department)=0;
	virtual Department* GetDepartment(int id)=0;
};
//详细产品B1:SqlserverDepartment
class SqlserverDepartment:public IDepartment
{
public:
	void Insert(Department department)
	{
		cout<<"在Sql Server中给Department表加入了一条记录"<<endl;
	}
	Department* GetDepartment(int id)
	{
		cout<<"在SQL Server中依据ID得到Department表的一条记录"<<endl;
		return NULL;
	}
};
//详细产品B2:AccessDepartment
class AccessDepartment:public IDepartment
{
public:
	void Insert(Department department)
	{
		cout<<"在Access中给Department表加入了一条记录"<<endl;
	}
	Department* GetDepartment(int id)
	{
		cout<<"在Access中依据ID得到Department表的一条记录"<<endl;
		return NULL;
	}
};

//抽象工厂:IFactory
class IFactory
{
public:
	virtual IUser* CreateUser()=0;
	virtual IDepartment* CreateDepartment()=0;
};
//详细工厂1:SqlServerFactory
class SqlserverFactory:public IFactory
{
public:
	IUser* CreateUser()
	{
		return new SqlserverUser;
	}

	IDepartment* CreateDepartment()
	{
		return new SqlserverDepartment;
	}
};
//详细工厂2:AccessFactory
class AccessFactory:public IFactory
{
public:
	IUser* CreateUser()
	{
		return new AccessUser;
	}

	IDepartment* CreateDepartment()
	{
		return new AccessDepartment;
	}
};

//client
void  main()
{
	User user;
	Department department;

	//ConcreteFactory1
	IFactory* factory=NULL;
	factory=new SqlserverFactory;

	//ProductA1
	IUser* iu=NULL;
	iu=factory->CreateUser();
	iu->Insert(user);
	iu->GetUser(1);

	//ProductB1
	IDepartment* id=NULL;
	id=factory->CreateDepartment();
	id->Insert(department);
	id->GetDepartment(1);

	if(factory!=NULL)
	{
		delete factory;
		factory=NULL;
	}
	if(iu!=NULL)
	{
		delete iu;
		iu=NULL;
	}
	if(id!=NULL)
	{
		delete id;
		id=NULL;
	}

	system("pause");
}

(2)执行截图

时间: 2024-10-11 06:01:16

大话设计模式C++实现-第15章-抽象工厂模式的相关文章

《大话设计模式》学习笔记11:抽象工厂模式

切换数据库类型示例: 1.User类: public class User { public int Id { get; set; } public string Name { get; set; } } 2.AbstractProduct(以User为例): public interface IUser { void Insert(User user); User GetUser(int id); } 3.Product(以User.SQL Server为例): public class Sq

第3章 抽象工厂模式(Abstract Factory)

原文 第3章 抽象工厂模式(Abstract Factory) 场景我们的系统要同时支持两个数据库  SqlServer 跟Oracle数据库  并且不同的环境要进行随时切换. 看下面的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

java/android 设计模式学习笔记(4)---抽象工厂模式

再来介绍一下抽象工厂模式(Abstact Factory Pattern),也是创建型模式之一,上篇博客主要介绍了工厂方法模式.抽象工厂模式和工厂方法模式稍有区别.工厂方法模式中工厂类生产出来的产品都是具体的,也就是说每个工厂都会生产某一种具体的产品,但是如果工厂类中所生产出来的产品是多种多样的,工厂方法模式也就不再适用了,就要使用抽象工厂模式了. 抽象工厂模式的起源或者最早的应用,是对不同操作系统的图形化解决方案,比如在不同操作系统中的按钮和文字框的不同处理,展示效果也不一样,对于每一个操作系

设计模式学习笔记(十一:抽象工厂模式)

1.1概述 提供一个创建一系列或相互依赖对象的接口,而无须指定他们具体的类.这就是抽象工厂模式的定义. 设计某些系统时可能需要为用户提供一系列相关的对象,但系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统来控制这些对象的创建,否则用户不仅要清楚地知道使用哪些类来创建这些对象,而且还必须要清楚对象之间是如何关联的,使得用户的代码和这些类形成紧耦合.缺乏弹性.不利于维护. 例如,军队要为士兵(用户)提供机关枪.手枪以及相应的子弹,但军队系统不希望由士兵提供来生产机关枪.手枪以及子弹,

设计模式学习(五)、抽象工厂模式

1.抽象工厂模式的概念: 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 2.抽象工厂模式的结构图 3.抽象工厂模式角色说明 抽象工厂(AbstractFactory)角色:所有的具体工厂都必须实现该接口,这个接口包含了一组方法来生产产品.具体工厂(ConcreteFactory)角色:实现不同的产品家族. 4.抽象工厂模式的实现 <?php /** * Created by PhpStorm. * User: Administrator * Date: 16-10-18

《大话设计模式》学习笔记系列--1. 简单工厂模式

简单工厂模式实现了一种"工厂"概念的面向对象设计模式,它可以在不指定对象具体类型的情况下创建对象.其实质是定义一个创建对象的接口,但让实现这个接口的类来决定实例化具体类.工厂方法让类的实例化推迟到子类中进行. 以书本上的计算器程序为例,其UML描述如下: 图中,AddOperator, SubtactOpertor继承算式基类Operator,而CreateOperator则是负责创建一个操作类,而不指明具体的子类类型. 下面,我们来看代码: 首先操作积累: /// <summa

《大话设计模式》ruby版代码:简单工厂模式

之前有看过<ruby设计模式>,不过渐渐的都忘记了.现在买了一个大话设计模式,看起来不是那么枯燥,顺便将代码用ruby实现了一下. # -*- encoding: utf-8 -*- #运算类 class Operation attr_accessor :number_a,:number_b def initialize(number_a = nil, number_b = nil) @number_a = number_a @number_b = number_b end def resul

大话设计模式C++实现-第26章-享元模式

一.UML图 二.概念 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象. flyweight的意思:轻量级. 三.说明 角色: (1)Flyweight类:它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态. (2)ConcreteFlyweight类:继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间. (3)UnsharedConcreteFlyweight:是指那些不需要共享的Flyweight子类

大话设计模式C++实现-第25章-中介者模式

一.UML 二.概念 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 三.说明 角色: (1)Colleague:抽象同事类. (2)ConcreteClleague:具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象. (3)Mediator:抽象中介者,定义了同事对象到中介者对象的接口. (4)ConcreteMediator:具体中介者对