抽象工厂模式与工厂模式的区别在于,抽象工厂是工厂类的升级版本。工厂模式适用于一维(产品等级),抽象工厂适用于二维(产品等级与产品簇)
抽象工厂模式
定义:
提供创建一系列相关或相互依赖的接口,通过具体的工厂类来创建二级产品的对象实例
优点:
(1)产品实例的细节进行封装,向客户隐藏了实例化步骤
(2)增加新产品只需增加产品类和生成产品实例的工厂类
缺点:
(1)产品类与产品实例生成类成对出现和维护
(2)增加了中间类代码编写维护量增加
使用范围:
二级关系的产品实例,产品间具有相似或者依赖关系
如宝马与奔驰工厂车系,控件皮肤样式等
结构:
实现APP、网页web工厂类生产对应游戏和银行操作实例
实现:
namespace creational_pattern
{
class product
{
public:
virtual void print() = 0;
};
class app_product : public product {};
class game_app_product : public app_product
{
public:
void print() override { std::cout << "game -- app" << std::endl; }
};
class bank_app_product : public app_product
{
public:
void print() override { std::cout << "bank -- app" << std::endl; }
};
class web_product : public product {};
class game_web_product : public web_product
{
public:
void print() override { std::cout << "game -- web" << std::endl; }
};
class bank_web_product : public web_product
{
public:
void print() override { std::cout << "bank -- web" << std::endl; }
};
class abstract_factory_pattern
{
public:
virtual std::shared_ptr<product> get_game_product() = 0;
virtual std::shared_ptr<product> get_bank_product() = 0;
};
class app_product_abstract_factory_pattern : public abstract_factory_pattern
{
public:
std::shared_ptr<product> get_game_product() override
{
return std::shared_ptr<product>{new game_app_product };
}
std::shared_ptr<product> get_bank_product() override
{
return std::shared_ptr<product>{new bank_app_product};
}
};
class web_product_abstract_factory_pattern : public abstract_factory_pattern
{
public:
std::shared_ptr<product> get_game_product() override
{
return std::shared_ptr<product>{new game_web_product };
}
std::shared_ptr<product> get_bank_product() override
{
return std::shared_ptr<product>{new bank_web_product};
}
};
}
测试:
基于GoogleTest 的单元测试框架;框架可参考如下网址:
https://www.cnblogs.com/jycboy/p/gtest_catalog.html
using namespace creational_pattern;
TEST(test_abstract_factory_pattern_get_product, get_a_product)
{
app_product_abstract_factory_pattern a_product;
a_product.get_game_product().get()->print();
}
TEST(test_abstract_factory_pattern_get_product, get_b_product)
{
web_product_abstract_factory_pattern b_product;
b_product.get_game_product().get()->print();
}
总结
(1)抽象工厂只适用于二维关系的产品等级结构和产品簇
(2)在具体工厂类通过不同方法创建二级产品实例