23种设计模式之(四)建造者模式(Builder)
本文主要介绍23种设计模式之建造者模式,附详细python/c++示例代码。
- 概念
- 应用场景
- 注意事项
- 代码示例
- 总结
- 代码链接
建造者模式(Builder)
概念
建造者模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
建造者模式是为对象的创建而设计的模式:
(1)创建的是一个复合对象,被创建的对象为一个具有复合属性的复合对象 ;
(2)关注对象创建的各部分的创建过程,不同的工厂对产品属性有不同的创建方法
GoF对建造者模式的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
应用场景
一个类的各个组成部分的具体实现类或者算法经常面临着变化,但是将他们组合在一起的算法却相对稳定,提供一种封装机制 将稳定的组合算法于易变的各个组成部分隔离开来。
代码示例
C++代码示例
/************************************************************************/
/* 设计模式专题
/*
/* 建造者模式
/*
/* Author : zzl
/*
/* 编程环境: window10 vs2010
/*
/* Date : 20180914
/************************************************************************/
#include <iostream>
#include "string"
class House
{
public:
void setDoor(std::string door)
{
this->m_door = door;
}
void setWall(std::string wall)
{
this->m_wall = wall;
}
void setWindow(std::string window)
{
this->m_window = window;
}
std::string getDoor( )
{
printf("%s\n",m_door.c_str());
return this->m_door ;
}
std::string getWall()
{
printf("%s\n",m_wall.c_str());
return this->m_wall;
}
std::string getWindow()
{
printf("%s\n",m_window.c_str());
return m_window;
}
private:
std::string m_door;
std::string m_wall;
std::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;
}
python代码示例
# -*- coding: utf-8 -*-
###################################################################
# 设计模式专题
#
# 建造者模式
#
# Author : zzl
#
# 编程环境: window10 python2.7
#
# Date : 20180914
##################################################################
class House(object):
def __init__(self):
self.door = ""
self.wall = ""
self.window = ""
def show_door(self):
print(self.door)
def show_wall(self):
print(self.wall)
def show_window(self):
print(self.window)
class Builder(object):
def __init__(self):
self.house = None
def build_wall(self):
pass
def build_door(self):
pass
def build_window(self):
pass
def get_house(self):
return self.house
# 公寓工程队
class FlatBuilder(Builder):
def __init__(self):
self.house = House()
def build_wall(self):
self.house.wall = "flat wall"
def build_door(self):
self.house.door = "flat door"
def build_window(self):
self.house.window = "flat window"
def get_house(self):
return self.house
# 别墅villa工程队
class VillaBuilder(Builder):
def __init__(self):
self.house = House()
def build_wall(self):
self.house.wall = "villa wall"
def build_door(self):
self.house.door = "villa door"
def build_window(self):
self.house.window = "villa window"
def get_house(self):
return self.house
# 设计师(指挥者)负责建造逻辑
# 建筑队干具体的活
class Director(object):
def __init__(self, builder):
self.builder = builder
def construct(self):
self.builder.build_wall()
self.builder.build_door()
self.builder.build_window()
if __name__ == "__main__":
# 请一个建造别墅的工程队
builder = VillaBuilder()
# 设计师指挥工程队干活
director = Director(builder)
director.construct()
house = builder.get_house()
house.show_door()
house.show_wall()
house.show_window()
# 请公寓FlatBuilder
builder = FlatBuilder()
director = Director(builder)
director.construct()
house = builder.get_house()
house.show_door()
house.show_wall()
house.show_window()