1. 程式人生 > >設計模式(2)

設計模式(2)

3.4建造者模式         將複雜的物件構建與其表示相分離,使得同樣的構建過程可以建立不同的物件表示。         public class Product         {             public string PartA{get;set;}             public string PartB{get;set;}                     }                  public abstract class Bulder         {                         public abstract void BuildPartA();             public abstract void BuildPartB();                          public abstract Product BuildProduct();         }                  public class BulderSon1 : Bulder         {             private Product product=new Product();                          public override void BuildPartA()             {                 this.product.PartA="BulderSon1.PartA";             }             public override void BuildPartB()             {                 this.product.PartB="BulderSon1.PartB";             }                          public Product BuildProduct()             {                 return this.product;             }         }                  public class BulderSon2 : Bulder         {             private Product product=new Product();                          public override void BuildPartA()             {                 this.product.PartA="BulderSon2.PartA";             }             public override void BuildPartB()             {                 this.product.PartB="BulderSon2.PartB";             }                          public Product BuildProduct()             {                 return this.product;             }         }                  public class Director         {             public void Construct(Builder builder)             {                 builder.BuildPartA();                 builder.BuildPartB();             }                 }                  3.5原型模式         用原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件。         分為淺克隆、深克隆。         二者的區別:淺拷貝是指當物件的欄位值被拷貝時,欄位引用的物件不會被拷貝。         例如,如果一個物件有一個指向字串的欄位,並且我們對該物件做了一個淺拷貝,那麼這兩個物件將引用同一個字串。         而深拷貝是對物件例項中欄位引用的物件也進行拷貝,如果一個物件有一個指向字串的欄位,         並且我們對該物件進行了深拷貝的話,那麼我們將建立一個物件和一個新的字串,新的物件將引用新的字串。         也就是說,執行深拷貝建立的新物件和原來物件不會共享任何東西,改變一個物件對另外一個物件沒有任何影響,         而執行淺拷貝建立的新物件與原來物件共享成員,改變一個物件,另外一個物件的成員也會改變。         //淺克隆         public  class Prototype :ICloneable         {             public int A{ get; set;}             public string Str{ get; set;}                          public BasePrototype(int a,string str)             {                 this.A=a;                 this.Str=str;             }                          public  Object Clone()             {                 return (Object)this.MemberwiseClone();             }                      }         //深克隆         public  class Prototype :ICloneable         {             public int A{ get; set;}             public string Str{ get; set;}                          public BasePrototype(int a,string str)             {                 this.A=a;                 this.Str=str;             }                          public  Object Clone()             {                 Prototype obj = new Prototype(this.A,this.Str);                             return obj;                              }                      }                  3.6單例模式         (1)確保一個類只有一個例項;         (2)它必須自行建立這個例項;                 (3)提供一個訪問它的全域性訪問點;         單執行緒下單例模式實現:         public class Single         {             //1確保一個類只有一個例項             private static Single uniqueInstance;             //2它必須自行建立這個例項             private Single()             {             }             //3提供一個訪問它的全域性訪問點             public static Singleton GetInstance()             {                             if (uniqueInstance == null)                 {                     uniqueInstance = new Singleton();                 }                 return uniqueInstance;             }                  }         多執行緒下單例模式實現:         public class Single         {             //1確保一個類只有一個例項             private static Single uniqueInstance;             // 定義一個標識確保執行緒同步             private static readonly object locker = new object();             //2它必須自行建立這個例項             private Single()             {             }             //3提供一個訪問它的全域性訪問點             public static Single GetInstance()             {                     lock(locker)                 {                     if (uniqueInstance == null)                     {                         uniqueInstance = new Single();                     }                 }                 return uniqueInstance;             }                  }