建造者模式

意图:

将复杂对象的表现形式同其构造相分离,这样,同样的构造过程就可以产生不同的表现形式。 

结构图:

 

建造者模式

 

 

 

对于一个复杂的对象,其各个部分可能会需要使用不同的算法,或者是创建过程,但是,虽然各个部分的需求会产生变动,但是作为构造一个整体的过程:需要创建的部分,各个部分的创建顺序等,保持相对的稳定。在系统创建这样的对象时,通过采用建造者模式,可以将对象的表现形式和其创建过程分离开来,同时,通过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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午3:22
下一篇 2023年2月9日 上午3:23

相关推荐