GOF 給建造模式的定義為:将一個複雜對象的建構與它的表示分離,使得同樣的建構
過程可以建立不同的表示。即,将構造複雜對象的過程群組成對象的部件解耦。就像攢電腦一樣,不管什麼品牌的配件,隻要相容就可以裝上;同樣,一樣的配件,可以有好多組裝的方式。這是對降低耦合、提高可複用性精神的一種貫徹。
将産品的内部表象和産品的生成過程分割開來,進而使一個建造過程生成具有不同的内部表象的産品對象。建造模式使得産品内部表象可以獨立的變化,客戶不必知道産品内部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。
當要生成的産品有複雜的内部結構——比如由多個對象組成;而系統中對此産品的需求
将來可能要改變産品對象的内部結構的構成,比如說産品的一些屬性現在由一個小對象組
成,而更改後的型号可能需要N 個小對象組成;而且不能将産品的内部構造完全暴露給客
戶程式,一是為了可用性,二是為了安全等因素。滿足上面的設計環境就可以考慮使用建造
模式來搭建架構了。
1、組成:
1) 抽象建造者角色:這個角色用來規範産品對象的各個組成成分的建造。一般而言,此角色獨立于應用程式的業務邏輯。
2) 具體建造者角色:擔任這個角色的是于應用程式緊密相關的類,它們在指導者的調用下建立産品執行個體。這個角色在實作抽象建造者角色提供的方法的前提下,達到完成産品組裝,提供成品的功能。
3) 指導者角色:調用具體建造者角色以建立産品對象。指導者并沒有産品類的具體知識,真正擁有産品類的具體知識的是具體建造者對象。
4) 産品角色:建造中的複雜對象。它要包含那些定義元件的類,包括将這些元件裝配成産品的接口。
2、UML類圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukjM2QDNzADOx8CX2AzMxAjMvwFduVWboNWY0RXYvwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
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