大话设计模式:抽象工厂模式

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

三种模式的对比:

  简单工厂模式 工厂模式 抽象工厂模式
产品 可以有多个但是都属于同一类,

同一等级。都继承产品抽象类。

可以有多个但是都属于同一类,同一等级。

都继承产品抽象类。

可以有不同种类的产品,每类有多中

具体产品;

抽象产品 只能有一个 只能有一个; 多个抽象产品类;每个抽象产品类可

以派生多种具体产品;

抽象工厂类   只能有一个,可以派生出多个具体工厂类; 只有一个,可派生出多个具体工厂类;
具体工厂 制造不同的产品,直接实例化

产品对象;

一个具体工厂类只能创建一个具体的产品; 可以创建多个具体产品类的实例;

以书上的数据库访问为例:

抽象工厂中的角色有:

(1)抽象工厂:只能一个(IFactory)

(2)具体工厂: 包括具体工厂1:SqlServerFactory和具体工厂2:AccessFactory。

具体工厂1用于生产具体产品A1:SqlserverUser和具体产品B1:SqlserverDepartment,

具体工厂2用于生产具体产品A2:AccessUser和B2;AccessDepartment,

(3)抽象产品: 包括抽象产品A:IUser和抽象产品B:IDepartment;

(4)具体产品:包括抽象产品A所对应的具体产品A1和A2,以及抽象产品B所对应的具体产品B1和B2.

优点:

(1)抽象工厂模式是对工厂方法模式的改进,可以处理多类的产品,不局限与某一类,因为有多个抽象产品类。例如此例如果在工厂方法模式下,产品只有User或者Department其中的一类,而抽象工厂模式下,产品包括User和Department两类)

(2)易于交换产品系列,例如我们在选择数据库时,只需要初始化一次AccessFactory或者SqlServerFactory,就可以使用不同数据库的配置,使之使用非常灵活。另外它使创建实例的过程与客户端分离。很好的符合了开放-封闭原则和依赖倒转原则。

缺点:如果要增加一个新的功能,需要改动的地方太多。

例如如果我们要增加一个新的项目表Project,那么我的增加至少三个类:IProject,SqlserverProject、AccessProject,还需要更改抽象类IFactory、SqlserverFactory和AccessFactory才可以实现,这是非常多的。

其UML图如下:

具体实现代码如下:

#include <iostream>
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;
	}
};
//客户端
int  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");
	return 0;
}  

运行结果:

小结:如果产品单一,要想达到以上的效果,合适用工厂模式;但是如果有多个品种分级时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。可以根据实际情况进行选择。

时间: 2024-12-25 17:26:59

大话设计模式:抽象工厂模式的相关文章

大话设计模式---抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 好处: 易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置. 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中. 所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合.

设计模式-抽象工厂模式(C#)

设计模式--抽象工厂模式(JAVA) 在抽象工厂模式中,一个具体工厂可以生产一组相关的具体产品,这样的一组产品成为产品族,产品族中的每一个产品都属于某一个产品继承等等级结构.当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构.属于不同类型的具体产品时就可以使用抽象工厂模式. 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建,当一个工

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

Java研究之学习设计模式-抽象工厂模式详解

 简介:          当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产[1] 品角色都有两个具体产品.抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化.每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.(摘自百度百科) 话语说得太抽象,程序员最好的表示方式

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 参考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/de

设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27091671 參考工厂模式: http://blog.csdn.net/caroline_wendy/article/details/27081511 抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不须要明白指定详细类. 所有代码: http://download.csdn.net/

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

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

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

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——抽象工厂模式(Abstract Factory) 4 */ 5 6 7 /* 8 * I

5. 星际争霸之php设计模式--抽象工厂模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248178.html============================================

1.大话设计模式-简单工厂模式

编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承.封装.多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用. 下面是服务器计算器代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <s