简单工厂、工厂方法和抽象工厂的区别

1、简单工厂模式

定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同父类。因为在简单工厂模式中用于创建实例的方法是静态方法,所以简单工厂模式也可以称为静态工厂方法模式,是一种类创建型模式。

在简单工厂模式中,工厂类只生产一类产品,所有具体的产品的创建都集中于工厂类中,根据所传入参数的不同可以创建不同的产品对象。

简单工厂模式中的角色:

工厂角色:实现创建所有产品实例的内部逻辑;

抽象产品角色:工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法;

具体产品角色:每一个具体角色都继承了抽象产品的角色,需要实现抽象产品中声明的抽象方法。

2、工厂方法模式

定义一个用于创建对象的接口,让子类决定将哪一个类实例化,它让一个类的实例化延迟到子类。它提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。它是基于工厂角色和产品角色的多态性而设计的。在系统中添加新产品时,无须修改抽象工厂类,只需添加一个新工厂类和新产品类就可以了。即工厂类可以生产多类产品。相应的产品由相对应的工厂来生产。

工厂方法模式中角色:

抽象产品:定义产品的接口,是产品对象的公共父类;

具体产品:实现了抽象产品接口,某种具体的产品由专门的具体工厂创建,即具体产品与具体工厂一一对应;

抽象工厂:声明了工厂方法,用于返回一个产品。所有创建对象的工厂类都必须实现该接口。

具体工厂:是抽象工厂的子类,实现了抽象工厂中定义的工厂方法,返回的是一个具体产品类的实例。

3、抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。在它的抽象工厂类中,它声明了可以生产一族产品的方法,而每一个方法又对应一种产品。

抽象工厂模式中的角色

抽象工厂:声明一组用于创建产品的方法,每一个方法对应一种产品;

具体工厂:实现在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族;

抽象产品:为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法;

具体产品:具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

三种的比较,例如

要创建几种不同的图形,即圆形、方形、三角形,可以使用简单工厂模式;

如果要创建很多种不同的图形,即圆形、方形、三角形、五角形等等,使用工厂方法模式;

如果要创建各种不同颜色不同形状的图形,这时就该使用抽象工厂模式了,可以把这几种的图形的共性抽象出来。

具体例子:

简单工厂:

class SingleCore//处理器,抽象产品
{
	
public:

	SingleCore()
	{
		cout<<" Constructed SingleCore "<
class Factory//重点工厂方法类
{

public:

	Factory()
	{
		cout<<" Constructed Factory "<
#include 

using namespace std;

#include "Simple Factory.h"

int main()
{
	int type;

	cout<<"Input a type of SingleCore: ";
	cin>>type;

	if(type == 1 || type == 2)
	{
		Factory *factory = new Factory();
		SingleCore *singlecore = factory->CreateSingleCore(type);
		singlecore->show();

		delete singlecore;
		delete factory;
	}
	else
		cout<<"no creating object"<

工厂方法:

#ifndef COREFACTORY_H
#define COREFACTORY_H

#include 

using namespace std;

#include "SingleCore.h"

#include "MultiCore.h"

class CoreFactory //生产处理器的工厂,抽象工厂
{
	
public:
	
	CoreFactory()
	{
		cout<<" Construted CoreFactory "<
#ifndef SINGLECORE_H
#define SINGLECORE_H

#include 

using namespace std;


class SingleCore//单核处理器,抽象产品
{

public:
	
	SingleCore()
	{
		cout<<" Construted SingleCore "<
#include 

using namespace std;

#include "CoreFactory.h"

int main()
{
	int type;
	cout<<" Input type of the product: ";
	cin>>type;

	switch( type )
	{
	case 1:
		{
			CoreFactory * FactoryA1 = new CoreFactoryA();//创建A型工厂
			SingleCore * Singlecore1 = FactoryA1->CreateSingleCore();//生产A型单核处理器
			
			cout<CreateSingleCore();//生产B型单核处理器		
			
			cout<
抽象工厂:

#ifndef ABSTRACT FACTORY_H
#define ABSTRACT FACTORY_H

#include 

using namespace std;

#include "IDepartment.h"
#include "IUser.h"

class Factory//抽象工厂
//包括Access工厂和Department工厂
{

public:

	Factory()
	{
		cout<<" Constructed Factory "<

#ifndef IDEPARTMENT_H
#define IDEPARTMENT_H

#include 

using namespace std;

class IDepartment//部门抽象接口,抽象产品一
//部门包括Access部门和Sql部门
{

public:

	IDepartment()
	{
		cout<<" Constructed IDepartment "<
#ifndef IUSER_H
#define IUSER_H

#include 

using namespace std;

class IUser//用户抽象接口,用于产生不同的用户,抽象产品二
//它包括Access用户和Sql用户
{

public:

	IUser()
	{
		cout<<" Constructed IUser "<

#include "Abstract Factory.h"

int main()
{
	Factory* factory = new SqlFactory();//新建一个Sql工厂
	IUser* user = factory->CreateUser();//创建Sql用户
	IDepartment* depart = factory->CreateDepartment();//创建Sql部门

	cout<GetUser();
	depart->GetDepartment();

	cout<




你可能感兴趣的:(设计模式)