意图:
将复杂对象的表现形式同其构造相分离,这样,同样的构造过程就可以产生不同的表现形式。
结构图:
对于一个复杂的对象,其各个部分可能会需要使用不同的算法,或者是创建过程,但是,虽然各个部分的需求会产生变动,但是作为构造一个整体的过程:需要创建的部分,各个部分的创建顺序等,保持相对的稳定。在系统创建这样的对象时,通过采用建造者模式,可以将对象的表现形式和其创建过程分离开来,同时,通过Director类降低了系统对对象创建的耦合性。
通常,建造者模式的使用有如下流程:
具体而言,当我们需要组建一个房间(对应上图的Client),其中包括了床(Bed),书桌(Desk),椅子(Chair)等东西。
Room::CreateRoom(){
bed = new Bed();
desk = new Desk();
chair = new Chair();
}
当对床,书桌和椅子的需求变动,或者需要加入新的东西时,需要改动Client中的代码(即上面代码中的Bed(),Desk(),Chair()或者新加入如Mirror * mirror = new Mirror())。通过采用建造者模式,先构造一个Director来管理对象的创建。
class Director{
public:
Director(Builder* builder){_builder = builder};
CreateRoom(Builder* _builder);
Private:
Builder*_builder;
}
使用Director可以管理builder对房间的建造过程,以及建造的内容:
Director::CreateRoom(Builder* _builder){
_builder->CreateRoom();
_builder->CreateBed();
_builder->CreateDesk();
_builder->CreateChair();
}
而RoomBuilder定义了供Director调用的抽象接口,
class RoomBuilder{
virtual void CreateRoom(){}
virtualvoid CreateBed(){}
virtual void CreateDesk(){}
virtual void CreateChair(){}
virtual Room* GetRoom(){return 0;}
}
这些接口在具体的派生类中实现:
class StardardRoomBuilder: public RoomBuilder{
public:
voidCreateRoom(){_room = new Room();}
voidCreateBed(){_room->bed = new Bed();}
voidCreateDesk(){_room->desk = new Desk();}
voidCreateChair(){_room->chair = new Chair();}
Room*GetRoom(){return _room;}
private:
Room*_room;
}
对于想要改变房间的风格,我们可以从RoomBuilder类派生出,重新设计后的MystyleRoomBuilder以改变现有的家具风格。
class MystyleRoomBuilder: public RoomBuilder{
voidCreateRoom(){_room = new Room();}
void CreateBed(){_room->bed = new MystyleBed();}
void CreateDesk(){_room->desk = new MystyleDesk();}
void CreateChair(){_room->chair = new MystyleChair();}
Room* GetRoom(){return_room;}
private:
Room* _room
}
在系统中创建一个房间的代码就更改为:
{
Room* room;
RoomBuilder* roomBuilder = new RoomBuilder();
// RoomBuilder*roomBuilder= new MystyleRoomBuilder();
Director *roomDirector= new Director();
roomDirector->CreateRoom(roomBuilder);
room = roomBuilder.GetRoom();
}
通过上面代码可以看出,使用建造者模式,RoomBuilder类仅向Director提供了公共的接口,来创建各个部份而将具体的创建代码放到了派生类来实现,这样,使得当需求变更时(比如上面需要改变房间内家具的样式风格时)可以很方便的通过派生builder类来改变room对象。
同时,因为Client并不需要知道复杂对象(room)的创建过程,只依赖于director来组建起对象的表现形式,不同的director可以复用具体的builder子类(StandardRoomBuilder)代码,来完成对象的组建。
通过director还可以良好的控制复杂对象room的组建过程。
适用性:
1、 创建复杂对象的算法需要独立于对象各个部分的创建和组合方式。
2、 对象的构造过程允许被构造的对象有不同的表现形式时
实现要点:
1、 组装和创建接口:Builder类的接口要足够泛化,能够实现各个具体的builder。
2、 产品没有抽象类:这是因为创建对象的算法复杂或是形式多样,因此没有必要也无可能抽象出一个抽象类
3、 Builder中的默认空函数,而不是纯虚函数:在C++中在派生类里只要改变感兴趣的方法,而不需要重新定义整个类的所有方法。
原文链接: https://www.cnblogs.com/CS106A/archive/2012/06/03/2532763.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/51822
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!