工厂模式与简单工厂的区别在与,简单工厂是工厂类创建实例对象;工厂模式是对不同产品类增加各自的创建工厂类
工厂模式
定义:
定义一个创建产品对象的接口工厂,用接口工厂的派生类实现对产品派生类的创建
优点:
(1)产品实例的细节进行封装,向客户隐藏了实例化步骤
(2)增加新产品只需增加产品类和生成产品实例的工厂类
缺点:
(1)产品类与产品实例生成类成对出现和维护
(2)增加了中间类代码编写维护量增加
使用范围:
客户端对创建实例与使用分离的情况,存在相似产品的集合。
如对不同类型文件解析等
结构:
实现:
namespace creational_pattern
{
class product
{
public:
virtual void print() = 0;
};
class a_product : public product
{
public:
void print() override { std::cout << 'A' << std::endl; }
};
class b_product : public product
{
public:
void print() override { std::cout << 'B' << std::endl; }
};
class factory_pattern
{
public:
virtual std::shared_ptr<product> get_product() = 0;
};
class a_product_factory_pattern : public factory_pattern
{
public:
std::shared_ptr<product> get_product() override
{
return std::shared_ptr<product>{new a_product};
}
};
class b_product_factory_pattern : public factory_pattern
{
public:
std::shared_ptr<product> get_product() override
{
return std::shared_ptr<product>{new b_product};
}
};
}
测试:
基于GoogleTest 的单元测试框架;框架可参考如下网址:
https://www.cnblogs.com/jycboy/p/gtest_catalog.html
TEST(test_factory_pattern_get_product, get_a_product)
{
a_product_factory_pattern a_product;
a_product.get_product().get()->print();
}
TEST(test_factory_pattern_get_product, get_b_product)
{
b_product_factory_pattern b_product;
b_product.get_product().get()->print();
}
总结
(1)工厂模式是常用模式之一,基于简单工厂模式,将根据参数创建实例的步骤分成工厂派生类创建
(2)工厂模式适用于只有一层的产品等级(一维关系)