一、简单工厂模式
以汽车厂生产为例子:
- 工厂角色:(汽车厂)一个静态公有成员方法负责生产符合要求的产品;
- 抽象产品:是一个抽象类,其派生类有各种各样的产品;
- 具体产品:汽车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)优点
- 实现了对象创建和使用的分离
- 客户端仅需知道产品名对应参数即可,无需记忆类名
- 客户端可使用配置文件,不修改客户端代码的前提下,提高系统的灵活性
(2)缺点
- 工厂类职责过重
- 增加类个数,增加系统了系统的复杂程度
- 系统扩展困难,一旦增加新产品就必须修改工厂逻辑,当产品过多时就会导致工厂类过于复杂
- 简单工厂模式使用了静态工厂方法,造成角色无法形成基于继承的结构。
(3)使用场景
- 工厂类创建对象较少
- 客户端只关心传入工厂参数,不关心如何创建对象。