設計モードせっけいもーど:Builder PatternビルダーモードBuilder Pattern

20871 ワード

作者:TerryLee創建于:2006-01-04出典:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html収録于:2013-02-28
モデル図
  设计模式:建造者模式(Builder Pattern)
意図
複雑なコンストラクションをその表現から分離し、同じコンストラクションプロセスで異なる表現を作成できるようにします.
適用性
 
  • 複雑なオブジェクトを作成するアルゴリズムが、そのオブジェクトのコンポーネントおよびそれらのアセンブリ方式から独立しなければならない場合.
  • 構築プロセスが、構築されたオブジェクトに異なる表現を許可しなければならない場合.  

  • コード実装
    例の概要:
    クライアント:お客様.セットメニューを買いに行きたいです.(ハンバーガー、コーラ、ポテトチップスが入っています)1番と2番の2種類のコースが選べます.指導者役:レジ係.お客様がどんなコースを買いたいか知っていて、レストランの従業員にコースの準備を教えます.建造者役:レストランの従業員.レジの要求に応じて具体的なコースを用意し、ハンバーガー、コーラ、ポテトチップスなどをそれぞれ入れます.製品役:最後のコースは、すべて同じ皿に入れます.
    KFC店のセットコードは以下の通りです.
      1 using System;
    
      2 using System.Collections;
    
      3 using System.Reflection;
    
      4 namespace KFC
    
      5 {
    
      6     // Food ,        
    
      7     public class Food
    
      8     {
    
      9         Hashtable food = new Hashtable();        
    
     10         //     
    
     11         public void Add(string strName, string Price)
    
     12         {
    
     13             food.Add(strName, Price);
    
     14         }
    
     15         //       
    
     16         public void Show()
    
     17         {
    
     18             IDictionaryEnumerator myEnumerator = food.GetEnumerator();
    
     19             Console.WriteLine("Food List:");
    
     20             Console.WriteLine("------------------------------");
    
     21             string strfoodlist = "";
    
     22             while (myEnumerator.MoveNext())
    
     23             {
    
     24                 strfoodlist = strfoodlist + "

    " + myEnumerator.Key.ToString(); 25 strfoodlist = strfoodlist + ":\t" + myEnumerator.Value.ToString(); 26 } 27 Console.WriteLine(strfoodlist); 28 Console.WriteLine("
    ------------------------------
    "); 29 } 30 } 31 // Builder , , 32 public abstract class Builder 33 { 34 // 35 public abstract void BuildHamb(); 36 // 37 public abstract void BuildCoke(); 38 // 39 public abstract void BuildChip(); 40 // 41 public abstract Food GetFood(); 42 } 43 // GoldBuilder , , 44 public class GoldBuilder : Builder 45 { 46 private Food GoldFood = new Food(); 47 public override void BuildHamb() 48 { 49 GoldFood.Add("GoldHamb", "¥13.50"); 50 } 51 public override void BuildCoke() 52 { 53 GoldFood.Add("CokeCole", "¥4.50"); 54 } 55 public override void BuildChip() 56 { 57 GoldFood.Add("FireChips", "¥3.50"); 58 } 59 public override Food GetFood() 60 { 61 return GoldFood; 62 } 63 } 64 // NormalBuilder , , 65 public class NormalBuilder : Builder 66 { 67 private Food NormalFood = new Food(); 68 public override void BuildHamb() 69 { 70 NormalFood.Add("NormalHamb", "¥10.50"); 71 } 72 public override void BuildCoke() 73 { 74 NormalFood.Add("CokeCole", "¥4.50"); 75 } 76 public override void BuildChip() 77 { 78 NormalFood.Add("FireChips", "¥2.00"); 79 } 80 public override Food GetFood() 81 { 82 return NormalFood; 83 } 84 } 85 // FoodManager , 86 public class FoodManager 87 { 88 public void Construct(Builder builder) 89 { 90 builder.BuildHamb(); 91 builder.BuildCoke(); 92 builder.BuildChip(); 93 } 94 } 95 // Client 96 public class Client 97 { 98 public static void Main(string[] args) 99 { 100 FoodManager foodmanager = new FoodManager(); 101 Builder instance; 102 Console.WriteLine("Please Enter Food No:"); 103 string No = Console.ReadLine(); 104 105 string foodType =System.Configuration.ConfigurationManager.AppSettings["No" + No]; 106 instance = (Builder)Assembly.Load("KFC").CreateInstance("KFC." + foodType); 107 foodmanager.Construct(instance); 108 Food food = instance.GetFood(); 109 food.Show(); 110 Console.ReadLine(); 111 } 112 } 113 } 114 App.config 115 116 <?xml version="1.0" encoding="utf-8" ?> 117 <configuration> 118 <appSettings> 119 <add key="No1" value="NormalBuilder"></add> 120 <add key="No2" value="GoldBuilder"></add> 121 </appSettings> 122 </configuration>

     
    実現のポイント
    1、コンストラクタモードは主に「段階的に複雑なオブジェクトを急に構築する」ために使用され、ここで「段階的に」は安定したアルゴリズムであり、複雑なオブジェクトの各部分は常に変化する.
    2、製品は抽象クラスを必要とせず、特にオブジェクトを作成するアルゴリズムが複雑であるため、このモードを使用する場合、またはこのモードが製品の生成プロセスに適用され、その最終結果は大きく異なる可能性があり、抽象製品クラスを抽出することはできない.3、Builderモードは「オブジェクト部分」の需要変化を解決し、コンストラクタモードは常にコンビネーションモード(Composite Pattern)と組み合わせて使用する.
    効果
    1、コンストラクタモードの使用により、製品の内部表象を独立に変化させることができる.コンストラクタ・モードを使用すると、クライアントが製品の内部構成の詳細を知る必要がなくなります.
    2、各Builderは相対的に独立しており、他のBuilderとは関係ありません.3、構造プロセスをより細かく制御することができる.
    4、構築コードと表示コードを分ける.
    5、コンストラクタモードの欠点は、「ステップ構築アルゴリズム」の需要変動に対処しにくいことである.