C++ 建造者模式(builder)

简介

Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。

作用

建造者模式是将一个复杂对象和他的构造和组装过程分离,这样再重复创建不同对象时使用相同的流程进行建造。对于调用者来说,只需要知道产品的类型,而不需要知道具体的组装过程。

应用场景

1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同的表示时。

代码如下:


#include <iostream>
#include <string>

//人 基类
class abstract_person
{
public:
    abstract_person(void){}
    ~abstract_person(void){}
public:
	void set_name(std::string name){ m_name = name; }
    void set_head(int num){ m_head = num; }
    void set_leg(int num){ m_leg = num; }
    void set_arm(int num){ m_arm = num; }
	void print_result(void)
	{
		std::cout << "My name is " << m_name << ", head : " 
			<< m_head << ", leg : " << m_leg << ", arm : " 
			<< m_arm << " ."<< std::endl;
	}

private:
	std::string m_name;
    int		m_head = 0;//c++11支持这种写法
    int		m_leg = 0;
    int		m_arm = 0;
};

class builder
{
public:
    builder(void){ m_person = new abstract_person; }
    virtual ~builder(void){ delete m_person; }
public:
    virtual abstract_person *get_person() = 0;
	virtual void set_name(void) = 0;
    virtual void set_head(void) = 0;
    virtual void set_leg(void) = 0;
    virtual void set_arm(void) = 0;
public:
    abstract_person *m_person = nullptr;
};

//蓝胖 建造者
class lan_pang_bld : public builder
{
public:
    lan_pang_bld(void){}
    ~lan_pang_bld(void){}
public:
    virtual abstract_person *get_person(){ return m_person; }
	virtual void set_name(void){ m_person->set_name("lan_pang"); }
    virtual void set_head(void){ m_person->set_head(2); }
    virtual void set_leg(void){ m_person->set_leg(2); }
    virtual void set_arm(void){ m_person->set_arm(2); }
};

//大娜迦 建造者
class big_najia_bld : public builder
{
public:
    big_najia_bld(void){}
    ~big_najia_bld(void){}
public:
    virtual abstract_person *get_person(){ return m_person; }
	virtual void set_name(void){ m_person->set_name("big_najia"); }
    virtual void set_head(void){ m_person->set_head(1); }
    virtual void set_leg(void){ m_person->set_leg(0); }
    virtual void set_arm(void){ m_person->set_arm(2); }
};

//指挥者
class director
{
public:
    director(builder *bld){ m_builder = bld; }
    ~director(void){}
public:
    void construct(void)
	{
		m_builder->set_name();
		m_builder->set_head();
		m_builder->set_leg();
		m_builder->set_arm();
	}

public:
    builder *m_builder;
};

int main()
{
	std::cout << "start-up .." << std::endl;
	
	big_najia_bld hero1;
	lan_pang_bld hero2;
	director dir1(&hero1);
	dir1.construct();
	director dir2(&hero2);
	dir2.construct();
	hero1.get_person()->print_result();
	hero2.get_person()->print_result();
	
	std::cout << "done .." << std::endl;
    return 0;
}


执行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值