設計模式——(Abstract Factory)抽象工廠“改正為簡單工廠”


  設計面向對象軟件比較困難,而設計可復用的面向對象軟件就更加困難。你必須設計相關類,並設計類的接口和繼承之間的關系。設計必須可以解決當前問題,同時必須對將來可能發生的問題和需求也有足夠的針對性。掌握面向對象的設計模式,可以比較輕松的解決上述問題。

  本篇文章主要講解設計模式中最基本,也是最常用的(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         }
View Code

定義轎車類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     }
View Code

定義卡車類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         }
View Code

它們之間的繼承關系如下:

定義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         }
View Code

Abstract Factory模式有下面的一些優點和缺點:
1) 它分離了具體的類:

  Abstract Factory模式幫助你控制一個應用創建的對象的類。

2) 它使得易於交換產品系列

  一個具體工廠類在一個應用中僅出現一次—即在它初始化的時候。
3) 它有利於產品的一致性

  當一個系列中的產品對象被設計成一起工作時,一個應用一次只能使用同一個系列中的對象,這一點很重要。而Abstract Factory很容易實現這一點。
4) 難以支持新種類的產品

  難以擴展抽象工廠以生產新種類的產品。

  經過上面的講解不知道大家對(Abstract Factroy)抽象工廠的模式設計是否有所了解呢?如果有什么地方看不懂的話可以與我聯系。

  QQ:2584451009

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM