好的,各位观众老爷们。
今天我们来学习一下建造者模式的这个设计方法。
首先我们看下它的定义是啥?定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。
它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
这句话,我看了,属实不太懂。
但是我觉得可以用一个方式很好的理解。
那就是搞一个框架,里面的各个部分呢,都是可以变化的,但是框架不变,将不同的东西都塞在框架对应的位置就成了不同的产品,就可以了。
反正我是这样理解的,并且也可以根据不同的参数选择不通的配置,这样理解起来就方便很多了。
封装性好,构建和表示分离。
各个模块独立,方便管理。
扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。
1.2 模式缺点
产品的组成部分必须相同,这限制了其使用范围。
如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。
1.3 主要角色
产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
2、实例
2.1 无参数的实例
/*************************************************************************
> File : buidler_mode.cpp
> Author : 小和尚念经敲木鱼
> Email : null
> Time : Mon 26 Jul 2021 08:59:49 PM CST
*************************************************************************/
#include
/************************************************************************
* 文件说明
* 构造者模式示例
*************************************************************************/
class Builder
{
public:
virtual void Build_A() {};
virtual void Build_B() {};
virtual void Build_C() {};
virtual void Build_D() {};
virtual void Build_E() {};
};
class TestBuilder_A : public Builder
{
public:
std::string mName = "TestBuilder_A ";
public:
void Build_A() {std::cout <<mName << __func__ << std::endl;}
void Build_B() {std::cout <<mName << __func__ << std::endl;}
void Build_C() {std::cout <<mName << __func__ << std::endl;}
void Build_E() {std::cout <<mName << __func__ << std::endl;}
};
class TestBuilder_B : public Builder
{
public:
std::string mName = "TestBuilder_B ";
public:
void Build_A() {std::cout <<mName << __func__ << std::endl;}
void Build_B() {std::cout <<mName << __func__ << std::endl;}
void Build_C() {std::cout <<mName << __func__ << std::endl;}
void Build_D() {std::cout <<mName << __func__ << std::endl;}
void Build_E() {std::cout <<mName << __func__ << std::endl;}
};
class Director
{
private:
Builder * mBuilder = NULL;
public:
Director(Builder * builder) {mBuilder = builder;};
void CreateBuilder()
{
mBuilder->Build_A();
mBuilder->Build_B();
mBuilder->Build_C();
mBuilder->Build_D();
mBuilder->Build_E();
}
};
//
int main(int argc,char * argv[])
{
TestBuilder_A * test_build_a = new TestBuilder_A();
Director director(test_build_a);
director.CreateBuilder();
TestBuilder_B * test_build_b = new TestBuilder_B();
Director director2(test_build_b);
director2.CreateBuilder();
return 0;
}
/
//out
//TestBuilder_A Build_A
//TestBuilder_A Build_B
//TestBuilder_A Build_C
//TestBuilder_A Build_E
//TestBuilder_B Build_A
//TestBuilder_B Build_B
//TestBuilder_B Build_C
//TestBuilder_B Build_D
//TestBuilder_B Build_E
2.2 有参数的实例
/*************************************************************************
> File : builder2_mode.cpp
> Author : 小和尚念经敲木鱼
> Email : null
> Time : Thu 26 Aug 2021 11:24:25 AM CST
*************************************************************************/
#include
using namespace std;
/************************************************************************
* 文件说明
* 构造者模式示例
*************************************************************************/
class Computer
{
public:
std::string mCpu; //必须
std::string mRam; //必须
std::string mKeyBoard;//可选
std::string mDisplay;//可选
int mUsbCount;//可选
public:
class Builder
{
public:
std::string mCpu; //必须
std::string mRam; //必须
std::string mKeyBoard;//可选
std::string mDisplay;//可选
int mUsbCount;//可选
public:
Builder(std::string cpu,std::string ram)
{
this->mCpu = cpu;
this->mRam = ram;
}
Builder setCpu(std::string &cpu)
{
this->mCpu = cpu;
return *this;
}
Builder setRam(std::string ram)
{
this->mRam = ram;
return *this;
}
Builder setKeyBoard(std::string keyboard)
{
this->mKeyBoard = keyboard;
return *this;
}
Builder setDisplay(std::string display)
{
this->mDisplay = display;
return *this;
}
Builder setUsbCount(int usbcount)
{
this->mUsbCount = usbcount;
return *this;
}
Computer * build()
{
return new Computer(this);
}
};
Computer(Builder * builder)
{
this->mCpu = builder->mCpu;
this->mRam = builder->mRam;
this->mKeyBoard = builder->mKeyBoard;
this->mDisplay = builder->mDisplay;
this->mUsbCount = builder->mUsbCount;
}
Computer(Computer * computer)
{
this->mCpu = computer->mCpu;
this->mRam = computer->mRam;
this->mKeyBoard = computer->mKeyBoard;
this->mDisplay = computer->mDisplay;
this->mUsbCount = computer->mUsbCount;
}
public:
void display()
{
std::cout << "###################" <<std::endl;
std::cout << "mCpu = " << mCpu <<std::endl;
std::cout << "mRam = " << mRam <<std::endl;
std::cout << "mKeyBoard = " << mKeyBoard << std::endl;
std::cout << "mDisplay = " << mDisplay << std::endl;
std::cout << "mUsbCount = " << mUsbCount << std::endl;
std::cout << "###################" <<std::endl;
}
};
int main(int argc,char * argv[])
{
Computer * computer = new Computer(Computer::Builder("I3","Inter")
.setDisplay("32寸")
.setKeyBoard("双飞燕")
.setUsbCount(2).build());
computer->display();
Computer * computer_1 = new Computer(Computer::Builder("None","ARM")
.setKeyBoard("Rk")
.setUsbCount(1).build());
computer_1->display();
return 0;
}
//OUT
//###################
//###################
//mCpu = I3
//mRam = Inter
//mKeyBoard = 双飞燕
//mDisplay = 32寸
//mUsbCount = 2
//###################
//###################
//mCpu = None
//mRam = ARM
//mKeyBoard = Rk
//mDisplay =
//mUsbCount = 1
//###################
3、使用总结
一般来说,建造者模式应用于复杂对象的构建过程。
并且也应用于一些公共部分的功能,但是大家具体的是实现不一样的。
此模式可以灵活的选择多个参数,并且很多参数都可以默认有一个初始值,这样也为了保证能够构造出完整的对象。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)