天天看點

設計模式(二十三) 建造者模式 C++

意圖:将一個複雜的建構與其表示相分離,使得同樣的建構過程可以建立不同的表示。

主要解決:主要解決在軟體系統中,有時候面臨着"一個複雜對象"的建立工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是将它們組合在一起的算法卻相對穩定。

何時使用:一些基本部件不會變,而其組合經常變化的時候。

如何解決:将變與不變分離開。

變的構造方法,不變的構造順序

Builder模式和工廠模式的差別

Factory模式中

  • 有一個抽象的工廠。
  • 實作一個具體的工廠---汽車工廠。
  • 工廠生産汽車A,得到汽車産品A。
  • 工廠生産汽車B,得到汽車産品B。

這樣做,實作了購買者和生産線的隔離。強調的是結果。

Builder模式

  • 引擎工廠生産引擎産品,得到汽車部件A。
  • 輪胎工廠生産輪子産品,得到汽車部件B。
  • 底盤工廠生産車身産品,得到汽車部件C。
  • 将這些部件放到一起,形成剛好能夠組裝成一輛汽車的整體。
  • 将這個整體送到汽車組裝工廠,得到一個汽車産品。

這樣做,目的是為了實作複雜對象生産線和其部件的解耦。強調的是過程

  • Factory模式不考慮對象的組裝過程,而直接生成一個我想要的對象。
  • Builder模式先一個個的建立對象的每一個部件,再統一組裝成一個對象。
  • Factory模式所解決的問題是,工廠生産産品。
  • 而Builder模式所解決的問題是工廠控制産品生成器組裝各個部件的過程,然後從産品生成器中得到産品。
  • Builder模式不是很常用。模式本身就是一種思想。知道了就可以了。
#include <iostream>
#include "string"
using namespace std;

class House
{
public:
  void setDoor(string door)
  {
    this->m_door = door;
  }

  void setWall(string wall)
  {
    this->m_wall = wall;
  }

  void setWindow(string window)
  {
    this->m_window = window;
  }

  string getDoor()
  {
    cout << m_door << endl;
    return this->m_door;
  }

  string getWall()
  {
    cout << m_wall << endl;
    return this->m_wall;
  }

  string getWindow()
  {
    cout << m_window << endl;
    return m_window;
  }

private:
  string    m_door;
  string    m_wall;
  string    m_window;
};

class  Builder
{
public:
  virtual void buildWall() = 0;
  virtual void buildDoor() = 0;
  virtual void buildWindow() = 0;
  virtual House* getHouse() = 0;
};

//較高價的電梯大廈工程隊
class  FlatBuilder : public Builder
{
public:
  FlatBuilder()
  {
    m_house = new House;
  }

  virtual void buildWall()
  {
    m_house->setWall(" flat wall");
  }

  virtual void buildDoor()
  {
    m_house->setDoor("flat door");
  }

  virtual void buildWindow()
  {
    m_house->setWindow("flat window");
  }

  virtual House* getHouse()
  {
    return m_house;
  }
private:
  House *m_house;
};

//别墅villa工程隊
class  VillaBuilder : public Builder
{
public:
  VillaBuilder()
  {
    m_house = new House;
  }

  virtual void buildWall()
  {
    m_house->setWall(" villa wall");
  }

  virtual void buildDoor()
  {
    m_house->setDoor("villa door");
  }

  virtual void buildWindow()
  {
    m_house->setWindow("villa window");
  }

  virtual House* getHouse()
  {
    return m_house;
  }
private:
  House *m_house;
};

//設計師(指揮者)負責建造邏輯  
//建築隊幹具體的活
class Director
{
public:
  Director(Builder * build)
  {
    m_build = build;
  }
  void Construct()
  {
    m_build->buildWall();
    m_build->buildWindow();
    m_build->buildDoor();
  }
private:
  Builder * m_build;
};

void main()
{
  House        *house = NULL;
  Builder        *builder = NULL;
  Director    *director = NULL;

  // 請一個建造别墅的工程隊
  builder = new VillaBuilder;

  //設計師 指揮 工程隊 幹活
  director = new Director(builder);
  director->Construct();
  house = builder->getHouse();
  house->getWindow();
  house->getDoor();

  delete house;
  delete builder;

  //請 FlatBuilder 較高價的電梯大廈
  builder = new FlatBuilder;
  director = new Director(builder);
  director->Construct();
  house = builder->getHouse();
  house->getWindow();
  house->getDoor();
  delete house;
  delete builder;
  delete director;

  system("pause");
  return;
}