設計模式(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; } }