天天看點

設計模式(建立型)之建造者模式

        GOF 給建造模式的定義為:将一個複雜對象的建構與它的表示分離,使得同樣的建構

過程可以建立不同的表示。即,将構造複雜對象的過程群組成對象的部件解耦。就像攢電腦一樣,不管什麼品牌的配件,隻要相容就可以裝上;同樣,一樣的配件,可以有好多組裝的方式。這是對降低耦合、提高可複用性精神的一種貫徹。

        将産品的内部表象和産品的生成過程分割開來,進而使一個建造過程生成具有不同的内部表象的産品對象。建造模式使得産品内部表象可以獨立的變化,客戶不必知道産品内部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。

        當要生成的産品有複雜的内部結構——比如由多個對象組成;而系統中對此産品的需求

将來可能要改變産品對象的内部結構的構成,比如說産品的一些屬性現在由一個小對象組

成,而更改後的型号可能需要N 個小對象組成;而且不能将産品的内部構造完全暴露給客

戶程式,一是為了可用性,二是為了安全等因素。滿足上面的設計環境就可以考慮使用建造

模式來搭建架構了。

1、組成:

        1) 抽象建造者角色:這個角色用來規範産品對象的各個組成成分的建造。一般而言,此角色獨立于應用程式的業務邏輯。

        2) 具體建造者角色:擔任這個角色的是于應用程式緊密相關的類,它們在指導者的調用下建立産品執行個體。這個角色在實作抽象建造者角色提供的方法的前提下,達到完成産品組裝,提供成品的功能。

        3) 指導者角色:調用具體建造者角色以建立産品對象。指導者并沒有産品類的具體知識,真正擁有産品類的具體知識的是具體建造者對象。

        4) 産品角色:建造中的複雜對象。它要包含那些定義元件的類,包括将這些元件裝配成産品的接口。

2、UML類圖:

設計模式(建立型)之建造者模式

3、代碼實作:

JAVA:

Builder.java:

// 抽象建造者角色

public abstract class Builder {

 public abstract void BuildPartA();

 public abstract void BuildPartB();

}

// 具體建造者角色

class ConcreateBuilder1 extends Builder {

 public void BuildPartA(){

  System.out.println("BuilderPartA by ConcreateBuilder1");

 }

 public void BuildPartB(){

  System.out.println("BuilderPartB by ConcreateBuilder1");

class ConcreateBuilder2 extends Builder {

  System.out.println("BuilderPartA by ConcreateBuilder2");

  System.out.println("BuilderPartB by ConcreateBuilder2");

// 指導者角色

class Director {

private Builder m_builder;

 public Director(Builder pBuilder){

  this.m_builder = pBuilder;

 public void Construct(){

  m_builder.BuildPartA();

  m_builder.BuildPartB();

Main.cpp:

public class Main {

 public static void main(String[] args) {

  ConcreateBuilder1 cb1 = new ConcreateBuilder1();

  ConcreateBuilder2 cb2 = new ConcreateBuilder2();

  Director dr1 = new Director(cb1);

  Director dr2 = new Director(cb2);

  dr1.Construct();

  dr2.Construct();

輸出結果:

BuilderPartA by ConcreateBuilder1

BuilderPartB by ConcreateBuilder1

BuilderPartA by ConcreateBuilder2

BuilderPartB by ConcreateBuilder2

C++:

Builder.h:

#ifndef BUILDER_H

#define BUILDER_H

//  虛拟基類,是所有Builder的基類,提供不同部分的建構接口函數

class Builder

{

public :

 Builder(){}

 virtual ~ Builder(){}

 //  純虛函數,提供建構不同部分的建構接口函數

 virtual void BuilderPartA() = 0;

 virtual void BuilderPartB() = 0;

};

//  使用Builder建構産品,建構産品的過程都一緻,但是不同的builder有不同的實作

//  這個不同的實作通過不同的Builder派生類來實作,存有一個Builder的指針,通過這個來實作多态調用

class Director

public:

 Director(Builder * pBuilder);

 ~ Director();

 void Construct();

private:

 Builder * m_pBuilder;

//  Builder的派生類,實作BuilderPartA和BuilderPartB接口函數

class ConcreateBuilder1 : public Builder

 ConcreateBuilder1() {}

 virtual ~ ConcreateBuilder1() {}

 virtual void BuilderPartA();

 virtual void BuilderPartB();

class ConcreateBuilder2 : public Builder

 ConcreateBuilder2() {}

 virtual ~ ConcreateBuilder2() {}

#endif

Build.cpp:

#include "Builder.h"

#include <iostream>

void ConcreateBuilder1::BuilderPartA() {

 std::cout << " BuilderPartA by ConcreateBuilder1n " << std::endl;

void ConcreateBuilder1::BuilderPartB() {

 std::cout << " BuilderPartB by ConcreateBuilder1n " << std::endl;

void ConcreateBuilder2::BuilderPartA() {

 std::cout << " BuilderPartA by ConcreateBuilder2n " << std::endl;

void ConcreateBuilder2::BuilderPartB()  {

 std::cout  << " BuilderPartB by ConcreateBuilder2n " << std::endl;

Director::Director(Builder * pBuilder) : m_pBuilder(pBuilder){}

Director::~Director() {

 delete m_pBuilder;

 m_pBuilder = NULL;

//  Construct函數表示一個對象的整個建構過程,不同的部分之間的裝配方式都是一緻的,

//  首先建構PartA其次是PartB,隻是根據不同的建構者會有不同的表示

void Director::Construct() {

 m_pBuilder->BuilderPartA();

 m_pBuilder->BuilderPartB();

#include <stdlib.h>

int main(){

 Builder * pBuilder1 = new ConcreateBuilder1();

 Director * pDirector1 = new Director(pBuilder1);

 pDirector1->Construct();

 Builder * pBuilder2 = new ConcreateBuilder2();

 Director * pDirector2 = new Director(pBuilder2);

 pDirector2->Construct();

 delete pDirector1;

 delete pDirector2;

 system(" pause ");

 return 0;

 BuilderPartA by ConcreateBuilder1n 

 BuilderPartB by ConcreateBuilder1n 

 BuilderPartA by ConcreateBuilder2n 

 BuilderPartB by ConcreateBuilder2n

繼續閱讀