代码设计模式之简单工厂模式(Factory)

简单工厂模式

核心思想是用一个工厂来根据输入的条件产生不同的类,(返回父类接口或抽象类接口)。

其次利用多态原理,将实现类(继承于抽象接口)各自进行自己的实现。这样的话,在实现类中是一个高内聚的类,类与类之间没有任何关系。

 

优点:

      1、 对调用者来说不需要关系结果是由谁来实现,关心的是工厂提供的是客户想要的结果。

      2、对于扩展来说,对原来代码无影响,只需要扩展实现类,无须改动原代码。

缺点:

      1、每次有新的扩展类增加,都需要去改动工厂的代码,这相工厂与实现的依赖性比较强,两者间的耦合性较高。

      2、可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

     3、开放性比较差。在例子中只实现了宝码和保时捷,如果这个时候用户要求代理商提供奔驰,哪现在的代理商(工厂)就无能为力了,必须修改工厂中的代码才可以。

 

例子:

       有一间汽车制造代理商(工厂),客户只需要向代理商购买(定做)自己喜欢牌子的车即可。代理商不自己按排工人来实现,而是外包给专门的汽车制造商来实现。制造好之后,客户只需要来向代理商提车即可,而不关心是代理商自己制造还是交给其它人制造。

 

类图:

 

代理商类(工厂):

carfactory.h

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

        filename : carfactory.h

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


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

#ifndef CAR_FACTORY_H
#define CAR_FACTORY_H

#include "car.h"
#include "string"

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

	Car* getCar(const std::string carlogo);
};

#endif


 

carfactory.cpp

#include "StdAfx.h"
#include "carfactory.h"
#include "car.h"

CarFactory::CarFactory(void)
{
}

CarFactory::~CarFactory(void)
{
}

Car* CarFactory::getCar( const std::string carlogo )
{
	if (carlogo == "BMW")
	{
		return new BMWCarProductor();
	}
	if (carlogo == "Porsche")
	{
		return new PorscheCarProductor();
	}

	return NULL;
}


具体的制造商实现类,这里有一宝码制造商和保时捷制造商。

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;
}


Client调用演示

int _tmain(int argc, _TCHAR* argv[])
{
	CarFactory * carfactroy = new CarFactory();

	Car *car = carfactroy->getCar("Porsche");

	if (car)
	{
		car->viewEngine();
		car->carStart();
		car->carStop();
		delete car;
	}

	delete carfactroy;

	system("pause");
	return 0;
}



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

边缘998

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

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

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

打赏作者

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

抵扣说明:

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

余额充值