学习笔记:建造者模式
模式简介
:属于创建型模式,使用多个简单的对象一步一步构建一个复杂的对象。提供了一种创建对象的最佳方式。
为什么用
:我想创建的这个复杂的对象是不稳定的,有可能需要这个,也可能不需要这个,选择需要的组合。
怎么样用
:首先保证这多个简单的对象有共同的父类,实现了相同的方法,再写个组装的,把需要的对象放到一起,最后写个builder把不同的组装过程封装起来。
注意事项
:当简单对象具有可以抽象出来的共同点才使用。
实际举例
:掉落或者制作武器的实现
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//游戏装备属性
class EquipmentAttribute {
public:
virtual void set(string value) {
cout << "待添加属性\n";
}
};
class EquipmentAttribute_Name : public EquipmentAttribute {
public:
void set(string value) {
cout << "名称: "+value+"\n";
}
};
class EquipmentAttribute_HP: public EquipmentAttribute {
public:
void set(string value) {
cout << "HP+"+value+"点\n";
}
};
class EquipmentAttribute_MP : public EquipmentAttribute {
public:
void set(string value) {
cout << "MP+" + value + "点\n";
}
};
class EquipmentAttribute_ATK : public EquipmentAttribute {
public:
void set(string value) {
cout << "ATK+" + value + "点\n";
}
};
class EquipmentAttribute_DEF : public EquipmentAttribute {
public:
void set(string value) {
cout << "DEF+" + value + "点\n";
}
};
//游戏装备
class Equipment {
private:
vector<EquipmentAttribute>v;
public:
//添加属性
void addAttribute(const EquipmentAttribute &ea) {
v.push_back(ea);
}
};
//游戏装备制作者
class EquipmentBuilder {
public:
//制作图纸1
Equipment buildEquipment_1() {
Equipment t;
EquipmentAttribute_Name name; name.set("痛苦面具"); t.addAttribute(name);
EquipmentAttribute_HP hp; hp.set("600"); t.addAttribute(hp);
EquipmentAttribute_ATK atk; atk.set("120"); t.addAttribute(atk);
return t;
}
//制作图纸2
Equipment buildEquipment_2(){
Equipment t;
EquipmentAttribute_Name name; name.set("时光之杖"); t.addAttribute(name);
EquipmentAttribute_HP hp; hp.set("300"); t.addAttribute(hp);
EquipmentAttribute_MP mp; mp.set("300"); t.addAttribute(mp);
EquipmentAttribute_ATK atk; atk.set("60"); t.addAttribute(atk);
return t;
}
//制作图纸3
Equipment buildEquipment_3() {
Equipment t;
EquipmentAttribute_Name name; name.set("炽天使之拥"); t.addAttribute(name);
EquipmentAttribute_MP mp; mp.set("1000"); t.addAttribute(mp);
EquipmentAttribute_ATK atk; atk.set("80"); t.addAttribute(atk);
return t;
}
};
int main()
{
//装备制作者
EquipmentBuilder equipmentBuilder;
//制作第1种武器
Equipment equipment=equipmentBuilder.buildEquipment_1();
//其他测试
equipment = equipmentBuilder.buildEquipment_2();
equipment = equipmentBuilder.buildEquipment_3();
return 0;
}