设计模式(5)-对象创建型模式-Builder模式

本文深入解析建造者模式的功能与应用场景,介绍其结构、参与者及协作关系,并通过C++与Java实例展示如何创建复杂对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1           Builder模式

1.1.1      功能

这个模式的描述在GoF上描述的比较抽象,想做到两点:

1.      创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式:

这句话要分为三个部分来理解:

1).主语缺省为客户程序,是客户程序来创建复杂对象;

2).要独立于该对象的组成部分,需要builder来封装这些组成部分(组件)的实现;

3).要独立于装配方式,需要Director类来封装这些组装方式.

2.  当构造过程必须允许被构造的对象有不同的表示时

       1).对这句话的理解是:builder中的组成部分要允许传入不同的参数从而对同一个组成部分生成不同的对象.

1.1.2      结 构、参与者与协作关系


参与者:

•B u i l d e r

                — 为创建一个P r o d u c t对象的各个部件指定抽象接口。

•C o n c r e t e B u i l d e r

                — 实现Bu i l d e r的接口以构造和装配该产品的各个部件。

                — 定义并明确它所创建的表示。

                — 提供一个检索产品的接口。

•Director

                — 构造一个使用Bu i l d e r接口的对象。

•P r o d u c t

                — 表示被构造的复杂对象。C o n c r e t e B u i l d e r创建该产品的内部表示并定义它的装配过程。

                — 包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

  协作


•  客户创建D ir e c t o r对象,并用它所想要的 B u i l d e r对象进行配置。

•  一旦产品部件被生成,导向器就会通知生成器。

•  生成器处理导向器的请求,并将部件添加到该产品中。

•  客户从生成器中检索产品。

1.1.3         例子-C++

                这里例子来自GoF,其中MazeBuilder即builder类,MazeGame即director类,MazeGame的CreateMaze方法即为construct()方法.

                M a z e B u i l d e r类定义了创建各种创建迷宫部件的builder类的接口:

                Class MazeBuilder{
                public:
                                virtualvoid BuildMaze(){}
                                virtualvoid BuildRoom(int room){}
                                virtualvoid BuildDoor(int roomFrom,int roomTo){}
                                virtualMaze *GetMaze(){return 0;}

                protected:
                                MazeBuilder();

                }

                Maze*MazeGame::CreateMaze(MazeBuilder &builder)
                {

                                builder.BuildMaze();

                                builder.BuildRoom(1);

                                builder.BuildDoor(1,2);
                }

                子类StandardMazeBuilder是一个创建简单迷宫的实现,他将要创建的迷宫放在变量_CurrentMaze中。

Class StandardMazeBuilder : public MazeBuilder
{

public:
                StandardMazeBuilder();

                virtualvoid BuildMaze();

                virtualvoid BuildRoom(int);

                virtualvoid BuildDoor(int,int);

                VirtualMaze*GetMaze();

Private:

                DirectionCommonWall(Room*,Room*);

                Maze *_currentMaze;

}

 

客户现在可以使用CreateMaze和StandardMazeBuilder来创建一个迷宫:

Maze *maze;

MazeGame game;

StandardMazeBuilder builder;

game.CreateMaze(builder);

Maze=builder.GetMaze();

 

 

 

 

1.1.4      例子-Java 代码

                生产一辆汽车,生产汽车的厂家不需要知道引擎怎么生产的,不需要关心轮胎怎么生产的,也不需要关心玻璃怎么生产的。当他在生产一辆车的时候,只会说,我要一块日本产的引擎,于是就有了日本产的引擎(至于日本引擎怎么生产的他不关心,他只要一个引擎的成品),他又说我要一块美国产的玻璃,于是就有了美国产的玻璃,这样直到他得到了所有的构件,然后他把这些构件组装起来,组成一个成品(汽车)卖给客户。

/**

 *定义产品类Car

 */ 

class Car{ 

   Glass glass1

   Glass glass2

   Glass glass3

   Glass glass4

   Wheel wheel1;

   Wheel wheel2;

   Wheel wheel3;

   Wheel wheel4;

   

}

 

//定义部件类:

package DesignPattern;

 

abstractclass Glass

}

 

classJapaneseGlass extends Glass{ 

   public StringtoString(){ 

       return"JapaneseGlass"

   } 

 

class AmericanGlassextends Glass{ 

   public StringtoString(){ 

       return"AmericanGlass"

   } 

 

 

abstractclass Wheel{ 

 

class JapaneseWheelextends Wheel{ 

   public StringtoString(){ 

       return"JapaneseWheel"

   } 

class AmericanWheelextends Wheel{ 

   public StringtoString(){ 

       return"AmericanWheel"

   } 

}

 

//定义 builder:

classCarABuilder implements CarBuilder{ 

   private Carproduct=null

   public CarABuilder(){ 

       product=new Car(); 

   } 

 

   @Override 

   publicvoid buildGlass(int glassNo) { 

       //TODO Auto-generatedmethod stub 

      switch(glassNo)

      {

      case 1:

             product.glass1=new AmericanGlass();

             break;

      case 2:

             product.glass2=new AmericanGlass();

             break;

      case 3:

             product.glass3=new AmericanGlass();

             break;

      case 4:

             product.glass4=new AmericanGlass();

             break;              

      }

 } 

   @Override 

   publicvoid buildWheel() { 

       //TODO Auto-generatedmethod stub 

       product.wheel1=new JapaneseWheel();

       product.wheel2=new JapaneseWheel();

       product.wheel3=new JapaneseWheel();

       product.wheel4=newJapaneseWheel();       

   } 

   @Override 

   public Car getProduct(){ 

       returnproduct

   } 

}

 

//定义director

class Director{ 

   private CarBuilderbuilder;  

   public Director() {} 

   public Carconstruct(CarBuilder builder) {

      this.builder = builder;  

      //本车只有两块玻璃

      this.builder.buildGlass(1);

      this.builder.buildGlass(2);

       return this.builder.getProduct(); 

   }  

 

package DesignPattern;

 

publicclass TestMain {

 

       /**

        *@param args

        */

       public static void main(String[] args){

              Carc=new Car();

              CarABuilderaBuilder=new CarABuilder();

              Directord=new Director();

              d.construct(aBuilder);

              c=aBuilder.getProduct();

              System.out.println("Glass1:"+c.glass1+"Glass2:"+c.glass2+" Glass3:"+c.glass3+" Glass4:"+c.glass4);

       }

}
Builder模式 将一个复杂对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示 统设计中,有时候面临着一个“复杂系统”的创建工作,该对象通常由各个部分的子对象用一定的算法构成,或者说按一定的步骤组合而成;这些的算法和步骤是稳定的,而构成这个对象的子对象却经常由于需求改变而发生变化,此时我们可以选择使用Builder模式。尽管Builder模式相当容易让人误解,但我认为这几点应该是不会有错的。因此我个人认为Builder模式中要好好把握如下几点 1. 需要创建的对象是复杂对象 2. 对象的创建过程是一步步创建(即:可能由于过程的不同而导致有不同对象展示) 3. 明确建造者(Builder)、具体建造者(Concrete Builder)、指导者(Director)、产品(Product)之间的职责和联系。 ◆建造者(Builder): 给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是 具体建造者(ConcreteBuilder):具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。 ◆具体建造者(Concrete Builder): 担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括: ■实现Builder角色提供的接口,一步一步完成创建产品实例的过程。 ■在建造过程完成后,提供产品的实例。 ◆指导者(Director): 担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。 ◆产品(Product): 产品便是建造中的复杂对象。 详细见博客 http://blog.youkuaiyun.com/xiaoting451292510/article/details/8330462
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值