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

本文深入探讨简单工厂模式的核心思想、优点与缺点,并通过具体案例展示了如何在汽车制造领域应用此模式。详细介绍了代理商(工厂)的角色及其与具体制造商(实现类)之间的交互过程,同时提供了工厂类、具体制造商类的代码实现,以及客户端如何调用工厂获取不同品牌车辆的实例。文章旨在帮助开发者理解并灵活运用简单工厂模式解决实际编程问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单工厂模式

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

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

 

优点:

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

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

缺点:

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

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

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

 

例子:

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

 

类图:

 

代理商类(工厂):

carfactory.h

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

        filename : carfactory.h

		author: fengsh
        QQ:19985430
		blog :http://blog.youkuaiyun.com/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.youkuaiyun.com/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;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

边缘998

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

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

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

打赏作者

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

抵扣说明:

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

余额充值