2010-10-27 90 views
0

Im我無法擺脫工廠設計模式的概念。據我瞭解,它允許調用代碼不必擔心個別對象如何實例化,只需知道它將實現特定的接口。對工廠設計模式的簡潔描述

我不能看到這是如何保存任何代碼,但。

舉例來說,如果我有3種類型的車輛

lorry, car, van

的,我創建了一個類爲他們每個人,我可以只使用一個switch語句。而與工廠類的實例香港專業教育學院迄今所看到的,我能有一個接口:

Interface vehicle { 
    method drive(); 
} 

,然後一類:

Class vehiclefac implements vehicle { 
    method createvehicle(type) { 
    // choose car type and return 
}  
} 

我還需要使用switch語句來接我的類型車輛,除此之外,如果我想添加新車,我仍然必須將它們添加到switch語句的末尾,並創建適當的子類來實現它們。

如果有人可以清理我沒有得到id是非常感謝,python中的例子特別讚賞。

回答

1

這不是關於代碼的減少,更多的是依賴關係的解耦。如果你編碼到一個接口,並使用工廠來檢索你的實例,你不需要知道你正在使用什麼具體的類。如果稍後在項目中有人編寫替代實現,則可以將工廠配置爲使用新類而不修改工廠的客戶端。

例如,想象一個爲數據序列化創建流對象的工廠。一個實例可以請求一個流接口來自己序列化。根據配置或狀態,可以將工廠配置爲提供寫入文件系統的實例。在不同的狀態/配置中,它可能會發佈網絡流實現。選擇正確實現的工廠邏輯可以像需求一樣簡單或複雜,但客戶端代碼不需要知道關於各種實現的任何信息。

項目中的代碼不一定少於允許的代碼,但代碼鬆散耦合並且更容易維護。

0

該工廠意在封裝開關邏輯。這意味着您無需擔心在需要車輛的任何地方都可以創建車輛,並且在添加新型車輛時不需要在工廠以外的任何地方更改代碼。

0

將工廠視爲「虛擬構造函數」。是的,你必須有一個通用的接口,這是返回的對象的靜態類型,但只要他們實現了通用接口,你就可以創建任何類型。

至於添加新的子類型,你可以用允許它的語言進行反射來完成。我還不知道Python是否是其中之一。

1

factory method patternCreational pattern。它可以用來構建特定基本類型的對象,而不用指定確切的具體類型,這由任何輸入和工廠內的創建邏輯決定。

public class VehicleFactory 
{ 
    public IVehicle Create(int noOfWheels) 
    { 
     if (noOfWheels == 1) 
      return new UniCycle(); 
     if (noOfWheels == 2) 
      return new MotorCycle(); 
     if (noOfWheels == 3) 
      return new Trike(); 
     if (noOfWheels == 4) 
      return new Car(); 

     throw new NotImplementedException(); 
    } 
} 

public class UniCycle : IVehcicle { ... } 
public class MotorCycle: IVehcicle { ... } 
public class Trike: IVehcicle { ... } 
public class Car: IVehcicle { ... } 

以下是以您的汽車理念爲基礎的簡單C#示例。有用的是任何消費代碼都不關心具體的類是什麼,它只是回到了一個IVehicle。它不一定要用接口完成,儘管我更喜歡它們,但也可以根據具體情況使用抽象基類來完成。

當我使用工廠模式時,我通常會在工廠實現一個接口,這稱爲Abstract Factory Pattern。在這個例子中它會是這樣的:

public interface IVehicleFactory 
{ 
    IVehicle Create(int noOfWheels); 
} 

工廠然後可以注入類(見IoC)。一起它給你:

  • 去耦你的代碼。
  • 允許不同的工廠實現。
  • 使用代碼清理器,沒有對象實例化。
  • 單元測試更容易,更少複雜的具體類擔心。

我爲Abstract Factory Pattern提供的維基鏈接在Python中有一些示例。

0

工廠方法模式是創建模式。它封裝了應該爲特定情況創建相同對象層次結構的專門化的邏輯。