用Delphi实现四人帮(Gof)设计模式-8构建者模式 Builder - cococlout的专栏 - CSDN博客

来源:百度文库 编辑:神马文学网 时间:2024/04/28 01:20:36

用Delphi实现四人帮(Gof)设计模式-8构建者模式 Builder收藏

Builder是为创建一个Product对象的各个部件指定的抽象接口.ConcreteBuilder是具体的建造者,实现Builder接口,构造和装配各个部件.Product就是产品.指挥者是构建一个使用Builder接口的对象.类图如下.

构建者模式主要是用于创建一些复杂的对象,这些对象内部构建间建造顺序通常是稳定的,但对象内部的构建通常面临复杂的变化.建造者模式的好处是使得建造代码与表示代码相分离,由于建造者隐藏了该产品是如何组装的,因此若需要改变一个产品的内部表示,只需要定义一个具体的建造者就可以了.

所以建造者模式是当创建复杂对象的算法独立于该对象的组成部分以及它们的装配方法时,适用的模式.

 

实现构建者

  1. {************************************************** 

  2.   实现Builder Pattern           

  3.   UnitOwner:coco.zhang                            
  4.   Last Modified:2008-10-4                    
  5.  **************************************************}
  6. unit BuilderUnit;
  7. interface

  8. type   
  9.    MaxPartsNum = 1..100;
  10.   TParts = array [MaxPartsNum]of string;
  11.   { 声明产品类}
  12.   TProduct = class(TObject)
  13.      private 
  14.          MIndex :  integer;
  15.      MParts  : TParts;
  16.      public 
  17.           constructor Create;
  18.           procedure AddPart( Part : string );
  19.       procedure List;
  20.   end;
  21.    {声明抽象建造者}
  22.    TBuilder = class(TObject)
  23.     public
  24.         procedure BuildPartA;virtual;abstract;
  25.     procedure BuildPartB;virtual;abstract;
  26.     function    GetResult():TProduct;virtual;abstract;
  27.     end;
  28.    {声明建造者}
  29.    TConcreteBuilderA = class(TBuilder)
  30.     private
  31.        MProduct : TProduct;
  32.     public
  33.         constructor Create;
  34.         procedure BuildPartA;override;
  35.     procedure BuildPartB;override;
  36.     function    GetResult():TProduct;override;
  37.     end;
  38.    {声明建造者}
  39.    TConcreteBuilderB = class(TBuilder)
  40.     private
  41.        MProduct : TProduct;
  42.     public
  43.         constructor Create;
  44.         procedure BuildPartA;override;
  45.     procedure BuildPartB;override;
  46.     function    GetResult():TProduct;override;
  47.     end;

  48. implementation

  49. { 产品}
  50. constructor TProduct.Create;
  51. begin
  52.   MIndex := 1;
  53. end;

  54. procedure TProduct.AddPart( Part : string );
  55. begin
  56.     MParts[MIndex] := Part;
  57.     MIndex := MIndex + 1;
  58. end;

  59. procedure TProduct.List;
  60. var I : Integer;
  61. begin
  62.     for I := 1 to MIndex-1 do
  63.     begin
  64.        Writeln(MParts[I]);
  65.     end;
  66. end;
  67. {实现构建者A}
  68. constructor TConcreteBuilderA.Create;
  69. begin
  70.    MProduct := TProduct.Create;
  71. end;
  72. procedure  TConcreteBuilderA.BuildPartA;
  73. begin
  74.    MProduct.AddPart('添加部件A');
  75. end;
  76. procedure TConcreteBuilderA.BuildPartB;
  77. begin
  78.    MProduct.AddPart('添加部件B');
  79. end;
  80. function  TConcreteBuilderA.GetResult():TProduct; 
  81. begin
  82.        Result := MProduct;
  83. end;
  84.  {实现构建者B}
  85. constructor TConcreteBuilderB.Create;
  86. begin
  87.    MProduct := TProduct.Create;
  88. end;
  89. procedure  TConcreteBuilderB.BuildPartA;
  90. begin
  91.    MProduct.AddPart('添加部件X');
  92. end;
  93. procedure TConcreteBuilderB.BuildPartB;
  94. begin
  95.    MProduct.AddPart('添加部件Y');
  96. end;
  97. function  TConcreteBuilderB.GetResult():TProduct; 
  98. begin
  99.        Result := MProduct;
  100. end;
  101. end.

 

实现客户端

  1. program Builder;
  2. {$APPTYPE CONSOLE}
  3. uses 
  4.   BuilderUnit;
  5.  var
  6.    AVar : TBuilder;
  7.  begin
  8.    AVar := TConcreteBuilderA.Create;
  9.    AVar.BuildPartA;
  10.    AVar.BuildPartB;
  11.    AVar.GetResult.List;
  12.     
  13.   AVar := TConcreteBuilderB.Create;
  14.    AVar.BuildPartA;
  15.    AVar.BuildPartB;
  16.    AVar.GetResult.List;

  17.  end.

结果

 


D:\Projects\Delphi7\src\GofProjects\Builder> Builder
添加部件A
添加部件B
添加部件X
添加部件Y