2012-12-13 41 views
1

我打算通過使用抽象工廠模式來解決特定問題。我成功地實現工廠模式,但無法工廠模式擴展到抽象工廠在C中實現不同異常提供程序的抽象工廠模式#

我有兩個不同的地方異常詳細信息可存儲

  1. 文件系統
  2. 數據庫

我用工廠模式從客戶端抽象了客體創建細節

Int erface

public interface ILogException 
{ 
    void LogException(); 
} 

FileSystemLogger

public class FileExceptionLogger : ILogException 
{ 
    public void LogException() 
    { 
     Console.WriteLine("File Exception Logger"); 
    } 
} 

DBSystemLogger

public class DBExceptionLogger : ILogException 
{ 
    public void LogException() 
    { 
     Console.WriteLine("DB Exception Logger"); 
    } 
} 

工廠實現

public class ExceptionFactory 
{ 
    const int i = 1;  
    public static ILogException GetFactory() 
    { 
     if (i == 1) 
     { 
      return new FileExceptionLogger(); 
     } 
     else if (i == 2) 
     { 
      return new DBExceptionLogger(); 
     } 
     else 
     { 
      return new ServiceExcetionLogger(); 
     } 
    } 
} 

我知道這不是最好的實施,但我打算改變它。

現在FileSystemLoggerDatabaseLogger是本身就是一個工廠,我想組以下FileSystemLoggerDatabaseLogger下實施,使客戶能有FileSystemLoggerFactoryDatabaseLoggerFactory

FileSystemLogger

  1. FlatFileSystemLogger
  2. XMLFileSystemLogger

DatabaseLogger

  1. SQLSERVERLogger
  2. OracleLogger

我應該如何着手定義FileSystemLoggerFactoryDatabaseLoggerFactory

回答

2

如果你願意,你可以使工廠方法的一般之一:

public static ILogException GetFactory<T>() where T : ILogException 
{ 
    return (ILogException)Activator.CreateInstance<T>(); 
} 

這樣稱呼它:

ILogException logger = ExceptionFactory.GetFactory<FileExceptionLogger>(); 

你可能也想看看一個依賴注入庫像NInject,Unity等這些可以簡化這種問題,使您能夠集中接口綁定到哪些實現的邏輯。 (也就是說,您可以在應用程序或請求範圍中綁定一個實現。)

+0

感謝您的寶貴意見。建議的實現是否符合抽象工廠的要求? – rohit

+0

@rohit它不完全是一個「工廠」,因爲ILoggerException接口不提供創建新實體的方法。 – McGarnagle

+0

@rohit如果你不想使用泛型,你需要*某種方式來確定返回哪個實現。你面臨的問題是,使用你的庫的編碼器是否決定?是否有一些配置或者項目類型決定了它?或者如何? – McGarnagle