設計面向對象軟件比較困難,而設計可復用的面向對象軟件就更加困難。你必須設計相關類,並設計類的接口和繼承之間的關系。設計必須可以解決當前問題,同時必須對將來可能發生的問題和需求也有足夠的針對性。掌握面向對象的設計模式,可以比較輕松的解決上述問題。
本篇文章主要講解設計模式中最基本,也是最常用的(Abstract Factory)抽象工廠。
適用性:
在以下情況可以使用Abstract Factory模式
• 一個系統要獨立於它的產品的創建、組合和表示時。
• 一個系統要由多個產品系列中的一個來配置時。
• 當你要強調一系列相關的產品對象的設計以便進行聯合使用時。
• 當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。
舉個例子講解一下Abstract Factory主要應用場景。我們試想一下一輛轎車的制造過程,在最初學習面向對象編程時,我們會定義一個轎車類,里面封裝了轎車的一系列屬性,並且由轎車類自己將自己初始化。顯然這樣做足以應付當前需求,但是在將來的某一天我們需要設計一輛卡車呢?我們是不是必須再定義一個卡車類呢?這顯然不符合可復用的軟件設計思想。在面向對象的軟件設計模式中,我們充分分析轎車和卡車的屬性,抽象出一個公共的父類,並由轎車和卡車繼承,再定義一個Factory類來實例化轎車和卡車。采用這樣的設計模式,將來在增加自行車,摩托車等等只需定義它們的屬性即可,它們的初始化過程不需要重新定義。
結構:

下面我對上面問題進行一下具體講解:
首先我們定義公共父類Vehicle:應為Vehicle 不需要實例化所以定義為抽象類。
1 public abstract class Vehicle 2 { 3 private string name; 4 //品牌 5 public string Name 6 { 7 get { return name; } 8 set { name = value; } 9 } 10 private string color; 11 //顏色 12 public string Color 13 { 14 get { return color; } 15 set { color = value; } 16 } 17 public Vehicle() 18 { } 19 public Vehicle(string name, string color) 20 { 21 this.Name = name; 22 this.Color = color; 23 } 24 public virtual int Price() 25 { 26 int price = 0; 27 28 return price; 29 }
定義轎車類Car繼承Vehicle
1 public class Car : Vehicle 2 { 3 private int seat; 4 //座位數 5 public int Seat 6 { 7 get { return seat; } 8 set { seat = value; } 9 } 10 public Car() 11 { } 12 public Car(string name, string color, int seat) : 13 base(name, color) 14 { 15 this.Seat = seat; 16 } 17 public override int Price() 18 { 19 int price = 0; 20 price = 4 * Seat; 21 return price; 22 } 23 }
定義卡車類Truck繼承Vehicle
1 private int load; 2 //載重量 3 public int Load 4 { 5 get { return load; } 6 set { load = value; } 7 } 8 public Truck() 9 { } 10 public Truck(string name, string color, int load) 11 : base(name, color) 12 { 13 this.Load = load; 14 } 15 public override int Price() 16 { 17 int price = 0; 18 price = 4 * Load; 19 return price; 20 }
它們之間的繼承關系如下:

定義VehicleFactory類 初始化 轎車或卡車對象:
1 /// <summary> 2 /// 工廠類 3 /// </summary> 4 public class VehicleFactory 5 { 6 public static Vehicle CreateVehicle(string name, string color, int seat, int load,string type) 7 { 8 Vehicle vehicle = null; 9 switch (type) 10 { 11 case "car": 12 vehicle = new Car(name, color, seat); 13 break; 14 case "truck": 15 vehicle = new Truck(name, color, load); 16 break; 17 } 18 return vehicle; 19 }
Abstract Factory模式有下面的一些優點和缺點:
1) 它分離了具體的類:
Abstract Factory模式幫助你控制一個應用創建的對象的類。
2) 它使得易於交換產品系列
一個具體工廠類在一個應用中僅出現一次—即在它初始化的時候。
3) 它有利於產品的一致性
當一個系列中的產品對象被設計成一起工作時,一個應用一次只能使用同一個系列中的對象,這一點很重要。而Abstract Factory很容易實現這一點。
4) 難以支持新種類的產品
難以擴展抽象工廠以生產新種類的產品。
經過上面的講解不知道大家對(Abstract Factroy)抽象工廠的模式設計是否有所了解呢?如果有什么地方看不懂的話可以與我聯系。
QQ:2584451009
