【设计模式】简单工厂模式

一、简单工厂模式

以汽车厂生产为例子:

  • 工厂角色:(汽车厂)一个静态公有成员方法负责生产符合要求的产品;
  • 抽象产品:是一个抽象类,其派生类有各种各样的产品;
  • 具体产品:汽车car、公交车bus

对应的代码:
SimpleFactory.h

#ifndef SIMPLEFACTORY_H
#define SIMPLEFACTORY_H
#include <iostream>
#include <string>
using namespace std;
//抽象产品类
class Products
{
public:
	virtual void product() = 0;
};

//具体产品
class car : public Products
{
public:
	virtual void product()
	{
		cout << "create car" << endl;
	}
};

class bus : public Products
{
public:
	virtual void product()
	{
		std::cout << "create bus" << std::endl;
	}
};

//工厂类
class Factory
{
public:
	//静态
	static Products* create_product(const string& p_name)
	{
		Products* p = NULL;
		if(p_name == "car")
		{
			p = new car();
		}
		else if (p_name == "bus")
		{
			p = new bus();
		}

		return p;
	}
};

#endif

client.cpp

#include "SimpleFactory.h"
//客户端
int main()
{
	Products* pcar = Factory::create_product("car");
	pcar->product();

	//释放资源
	delete pcar;

	Products* pbus = Factory::create_product("bus");
	pbus->product();

	//释放资源
	delete pbus;
	
	return 0;
}

在这里插入图片描述


二、使用unique_ptr的优化

SimpleFactory.h


#ifndef SIMPLEFACTORY_H
#define SIMPLEFACTORY_H
#include <iostream>
#include <string>
#include <memory>
using namespace std;
//抽象产品类
class Products
{
public:
	virtual void product() = 0;
};

//具体产品
class car : public Products
{
public:
	virtual void product()
	{
		cout << "create car" << endl;
	}
};

class bus : public Products
{
public:
	virtual void product()
	{
		std::cout << "create bus" << std::endl;
	}
};

//工厂类
class Factory
{
public:
	//静态
	static unique_ptr<Products> create_product(const string& p_name)
	{
		
		if(p_name == "car")
		{
			return unique_ptr<Products>(new car());
		}
		else if (p_name == "bus")
		{
			return unique_ptr<Products>(new bus());
		}
		//没有匹配NULL
		return unique_ptr<Products>();
	}
};

#endif

client.cpp

#include "SimpleFactory.h"
//客户端
int main()
{
	unique_ptr<Products> upcar = Factory::create_product("car");
	upcar->product();

	unique_ptr<Products> upbus = Factory::create_product("bus");
	upbus->product();

	return 0;
}

在这里插入图片描述


三、简单工厂模式总结

(1)优点
  1. 实现了对象创建和使用的分离
  2. 客户端仅需知道产品名对应参数即可,无需记忆类名
  3. 客户端可使用配置文件,不修改客户端代码的前提下,提高系统的灵活性
(2)缺点
  1. 工厂类职责过重
  2. 增加类个数,增加系统了系统的复杂程度
  3. 系统扩展困难,一旦增加新产品就必须修改工厂逻辑,当产品过多时就会导致工厂类过于复杂
  4. 简单工厂模式使用了静态工厂方法,造成角色无法形成基于继承的结构。
(3)使用场景
  1. 工厂类创建对象较少
  2. 客户端只关心传入工厂参数,不关心如何创建对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值