建造者模式是将局部成员构建成一个整体,返回整体产品对象,抽象工厂是针对一系列产品的对象创建和返回
建造者模式
定义:
将一个复杂对象的构建与表示分离,通过导演类方法依次组装好局部零件返回产品对象
优点:
(1)客户端不需知道产品内部细节,只跟建造的导演类有依赖关系
(2)具体建造间无相关性,便于扩展
(3)产品集成创建只在导演类方法中,便于修改
缺点:
(1)创建的产品必须具有共性,否则导演类建造方法会很复杂
(2)产品内部比较复杂(既有众多的局部成员)具体的建造类会很庞大
使用范围:
产品内部结构具有多个成员变量,成员变量满足一定的建造顺序
如:电脑组装
结构:
director:导演类,实现产品局部零件的组装;product_builder_pattern:具体产品构建类,实现每个产品成员构建的方法
product:产品类,包含局部零件的成员
实现:
namespace creational_pattern
{
class product
{
public:
std::string part_head{""};
std::string part_trail{ "" };
};
class builder_pattern
{
public:
virtual void build_part_head() = 0;
virtual void build_part_trail() = 0;
virtual std::shared_ptr<product> get_product() = 0;
protected:
std::shared_ptr<product> pro{ new product };
};
class product_builder_pattern : public builder_pattern
{
public:
virtual void build_part_head() override
{
pro.get()->part_head = "创建头部成功";
}
virtual void build_part_trail() override
{
pro.get()->part_trail = "创建尾部成功";
}
virtual std::shared_ptr<product> get_product() override
{
return pro;
}
};
class director
{
public:
std::shared_ptr<product> construct()
{
builder.get()->build_part_head();
builder.get()->build_part_trail();
return builder.get()->get_product();
}
private:
std::shared_ptr<builder_pattern> builder{ new product_builder_pattern() };
};
}
测试:
基于GoogleTest 的单元测试框架;框架可参考如下网址:
https://www.cnblogs.com/jycboy/p/gtest_catalog.html
using namespace creational_pattern;
TEST(test_builder_pattern_director_construct, build_product)
{
director direc;
std::cout << direc.construct().get()->part_head << "---" << direc.construct().get()->part_trail << std::endl;
ASSERT_EQ(1 , 1);
}
总结
(1)建设者模式功能是实现将产品的零件组装成一个完整的产品(类似于组装手办)
(2)参品类只需知道组成的成员,无需关心成员流水线创建过程
(3)集成创建过程(类似组装总厂)负责对所有成员的组装,具体产品建造类提供对产品每个成员零件的封装方法