代码设计模式之抽象工厂模式(Abstract Factory)

对于简单工厂和工厂方法都是在同一种族(类)。但对于如果不同种族,就相对来说显得有所限制。

 

特点:

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。

 

优点:

抽象工厂模式主要在于应对“新系列”的需求变化。分离了具体的类,抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。抽象工厂模式有助于这样的团队的分工,降低了模块间的耦合性,提高了团队开发效率。

 

缺点:

抽象工厂模式在于难于应付“新对象”的需求变动。难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几乎确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。

 

适用范围:

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

 

 

例子:

        汽车总代理商可以为客户定制制造汽车,还提供一种新型服务就是免费为客户维护汽车。但同时客户可以就近选择一个子代理进行提车和维护。虽然用户可以选择提车和维护站点不同,但一个子代理只能提供一个站点进行维护。即要么在上海维护,要么在广州维户,实际情况客户想即在广州又在上海维护,这个时候就暴露出这个模式的不足之处。

 

类图:

 

抽像工厂类:

factory.h

/**************************************************************

        filename : car.h

		author: fengsh
        QQ:19985430
		blog :http://blog.csdn.net/fengsh998


		Abstract Factory Demo
*************************************************************/

#ifndef FACTORY_H
#define FACTORY_H

#include "car.h"
#include "carrepair.h"

class Factory
{
public:
	Factory(void);
	~Factory(void);

	virtual Car* getCar()=0;
	virtual CarRepair* repair()=0;
};

class BmwCarFactory : public Factory
{
public:
	BmwCarFactory();
	~BmwCarFactory();

	Car* getCar();
	CarRepair* repair();
};

class ProscheCarFactory : public Factory
{
public:
	ProscheCarFactory();
	~ProscheCarFactory();

	Car* getCar();
	CarRepair* repair();
};

#endif


factory.cpp

#include "StdAfx.h"
#include "factory.h"


Factory::Factory(void)
{
}

Factory::~Factory(void)
{
}

//BmwCarFactory class
BmwCarFactory::BmwCarFactory()
{

}

BmwCarFactory::~BmwCarFactory()
{

}

Car* BmwCarFactory::getCar()
{
	return new BMWCarProductor();
}

CarRepair* BmwCarFactory::repair()
{
	return new SHCarRepair();
}

//ProscheCarFactory class
ProscheCarFactory::ProscheCarFactory()
{

}

ProscheCarFactory::~ProscheCarFactory()
{

}

Car* ProscheCarFactory::getCar()
{
	return new PorscheCarProductor();
}

CarRepair* ProscheCarFactory::repair()
{
	return new GZCarRepair();
}


car.h

/**************************************************************

        filename : car.h

		author: fengsh
        QQ:19985430
		blog :http://blog.csdn.net/fengsh998


*************************************************************/
#ifndef CAR_H
#define CAR_H

#include "string"

class Car
{
public:
	Car(void);
	~Car(void);

	virtual void viewEngine() = 0;
	virtual void carStart() = 0;
	virtual void carStop() = 0;
};

class BMWCarProductor : public Car
{
public:
	BMWCarProductor();
	~BMWCarProductor();
	void viewEngine();
	void carStart();
	void carStop();
private:
	std::string m_engine;
};

class PorscheCarProductor : public Car
{
public:
	PorscheCarProductor();
	~PorscheCarProductor();
	void viewEngine();
	void carStart();
	void carStop();
private:
	std::string m_engine;
};

#endif


car.cpp

#include "StdAfx.h"
#include "car.h"
#include "iostream"



Car::Car(void)
{
}

Car::~Car(void)
{
}

BMWCarProductor::BMWCarProductor()
{
	this->m_engine = "BMW";
}

BMWCarProductor::~BMWCarProductor()
{

}

void BMWCarProductor::viewEngine()
{
	std::cout<<"The engine is "<<this->m_engine<<std::endl;
}

void BMWCarProductor::carStart()
{
	std::cout<<"The BMW Start."<<std::endl;
}

void BMWCarProductor::carStop()
{
	std::cout<<"The BMW Stop."<<std::endl;
}

PorscheCarProductor::PorscheCarProductor()
{
	this->m_engine = "Porsche";
}

PorscheCarProductor::~PorscheCarProductor()
{

}

void PorscheCarProductor::viewEngine()
{
	std::cout<<"The engine is "<<this->m_engine<<std::endl;
}

void PorscheCarProductor::carStart()
{
	std::cout<<"The Porsche Start."<<std::endl;
}

void PorscheCarProductor::carStop()
{
	std::cout<<"The Porsche Stop."<<std::endl;
}


carrepair.h

#ifndef CARREPAIR_H
#define CARREPAIR_H

class CarRepair
{
public:
	CarRepair(void);
	~CarRepair(void);

	virtual void getRepairAddress()=0;
	virtual void repairing()=0;
};

class SHCarRepair : public CarRepair
{
public:
	SHCarRepair(){};
	~SHCarRepair(){};
	void getRepairAddress();
	void repairing();
};

class GZCarRepair : public CarRepair
{
public:
	GZCarRepair(){};
	~GZCarRepair(){};
	void getRepairAddress();
	void repairing();
};

#endif


carrepair.cpp

#include "StdAfx.h"
#include "carrepair.h"
#include "iostream"

CarRepair::CarRepair(void)
{
}

CarRepair::~CarRepair(void)
{
}

void SHCarRepair::getRepairAddress()
{
	std::cout<<"shang hai repair department."<<std::endl;
}

void SHCarRepair::repairing()
{
	std::cout<<"repairing the car at shang hai."<<std::endl;
}

void GZCarRepair::getRepairAddress()
{
	std::cout<<"guang zhou repair department."<<std::endl;
}

void GZCarRepair::repairing()
{
	std::cout<<"repairing the car at guang zhou."<<std::endl;
}


客户调用演示:

#include "stdafx.h"
#include "stdlib.h"

#include "factory.h"
#include "carrepair.h"


int _tmain(int argc, _TCHAR* argv[])
{
	
	BmwCarFactory* bc = new BmwCarFactory();
	Car* bmw = bc->getCar();
	bmw->viewEngine();
	bmw->carStart();
	bmw->carStop();
	CarRepair* rp = bc->repair();
	rp->getRepairAddress();
	rp->repairing();

	ProscheCarFactory* pc = new ProscheCarFactory();
	Car* prosche = pc->getCar();
	prosche->viewEngine();
	prosche->carStart();
	prosche->carStop();
	CarRepair* cp = pc->repair();
	cp->getRepairAddress();
	cp->repairing();

	system("pause");
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边缘998

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值