创造型设计模式之建造者模式
特点:将复杂对象的构建过程和最终表示分离开来
比如组装电脑,构建过程是依次安装 CPU、内存、硬盘等组件 ;而表示是组装完
1 #include <iostream> 2 #include <mutex> 3 #include <string> 4 using namespace std; 5 6 /*-----------------------------------------------------------建造者模式------------------------------------------------------------------*/ 7 8 class Computer // 产品 9 { 10 public: 11 void setcpu(const std::string &cpu) { m_cpu = cpu; } 12 void setgpu(const std::string &gpu) { m_gpu = gpu; } 13 void setmemory(const std::string &memory) { m_memory = memory; } 14 void setstorage(const std::string storage) { m_storage = storage; } 15 16 void pointcfg() { std::cout << "cpu:" << m_cpu << '\n' 17 << "gpu:" << m_gpu << '\n' 18 << "memory:" << m_memory << '\n' 19 << "storage:" << m_storage << '\n'; } 20 21 private: 22 string m_cpu; 23 string m_gpu; 24 string m_memory; 25 string m_storage; 26 }; 27 28 class computerbuilder // 抽象一个建造者 29 { 30 public: 31 virtual ~computerbuilder() = default; 32 virtual void buildcpu() = 0; 33 virtual void buildgpu() = 0; 34 virtual void buildmemory() = 0; 35 virtual void buildstorage() = 0; 36 virtual Computer *getcomputer() = 0; 37 }; 38 39 class gamecomputerbuilder : public computerbuilder // 具体一个游戏本电脑建造者 40 { 41 public: 42 gamecomputerbuilder() { m_ptr = new Computer; }; 43 void buildcpu() override { m_ptr->setcpu("游戏CPU"); } 44 void buildgpu() override { m_ptr->setgpu("游戏GPU"); } 45 void buildmemory() override { m_ptr->setmemory("游戏MEMORY"); } 46 void buildstorage() override { m_ptr->setstorage("游戏STORAGE"); } 47 Computer *getcomputer() override { return m_ptr; } 48 49 private: 50 Computer *m_ptr; 51 }; 52 53 class workcomputerbuilder : public computerbuilder // 具体一个商务电脑建造者 54 { 55 public: 56 workcomputerbuilder() { m_ptr = new Computer; } 57 void buildcpu() override { m_ptr->setcpu("商务CPU"); } 58 void buildgpu() override { m_ptr->setgpu("商务GPU"); } 59 void buildmemory() override { m_ptr->setmemory("商务MEMORY"); } 60 void buildstorage() override { m_ptr->setstorage("商务STORAGE"); } 61 Computer *getcomputer() override { return m_ptr; } 62 63 private: 64 Computer *m_ptr; 65 }; 66 67 class builderconductor // 指挥者,负责具体的构造工作 68 { 69 public: 70 explicit builderconductor() = delete; 71 static void startgeneratecomputer(computerbuilder *ptr) 72 { 73 ptr->buildcpu(); 74 ptr->buildgpu(); 75 ptr->buildmemory(); 76 ptr->buildstorage(); 77 } 78 }; 79 80 int main(int argc, char *argv[]) 81 { 82 //构造游戏电脑 83 gamecomputerbuilder *gameptr = new gamecomputerbuilder; 84 builderconductor::startgeneratecomputer(gameptr); 85 gameptr->getcomputer()->pointcfg(); 86 // 构造商务电脑 87 workcomputerbuilder *workptr = new workcomputerbuilder; 88 builderconductor::startgeneratecomputer(workptr); 89 workptr->getcomputer()->pointcfg(); 90 return 0; 91 }
成后电脑呈现出的整体配置状态。通过分离,可灵活改变构建过程或表示方式,如用不同品牌组件构建,不影响电脑作为最终产品的呈现