2010-07-22 60 views
0

在下面的場景中,需要根據某些條件邏輯對對象進行類型化,工廠方法模式是否有助於避免客戶端代碼因數量而變得混亂的if/elseif條件(如果由於邏輯的不同變化而需要創建越來越多的產品,這也會成爲維護的噩夢)。工廠方法模式,以避免基於條件邏輯實例化對象

或者還有其他的設計模式可以拯救嗎?

public interface IProduct 
{ 
    void Method1(); 
} 

public class ProductA : IProduct 
{ 
    void Method1() 
    { 
    } 
} 

public class ProductB : IProduct 
{ 
    void Method1() 
    { 
    } 
} 

public class ProductC : IProduct 
{ 
    void Method1() 
    { 
    } 
} 

public class Client 
{ 
    public void Test() 
    { 
     int count = 5; 

     IProduct product; 

     if (count < 10) 
     { 
      product = new ProductA(); 
     } 
     else if (count == 10) 
     { 
      product = new ProductB(); 
     } 
     else if (count > 10) 
     { 
      product = new ProductC(); 
     } 

     product.Method1(); 


    } 
} 

回答

4

它看起來像工廠模式是你想要什麼:


public class ProductFactory 
{ 
    public IProduct GetProduct(int count) 
    { 
     if (count < 10) 
     { 
      return new ProductA(); 
     } 
     else if (count == 10) 
     { 
      return new ProductB(); 
     } 
     else if (count > 10) 
     { 
      return new ProductC(); 
     } 
    } 
} 

那麼無論你的客戶端代碼需要一個實例就可以去


public class Client 
{ 
    public void Test() 
    { 
     ProductFactory factory = new ProductFactory(); 

     IProduct product = factory.GetProduct(5); 

     product.Method1(); 
    } 
} 

2

我不相信Carver先生的解決方案嚴格遵循GOF設計模式手冊中描述的工廠模式的結構。然而,這是一個非常常見的編程習慣用法(簡單工廠),可能是這種設計的一個好方法。

工廠模式要求混凝土造物主來自造物主。通常,創作者將創建產品委託給具體創建者。這在未來可能添加新工廠時非常有用。例如,想象一下,如果您創建了一個新工廠,可以用較少資源製造特定產品(計數用作「資源」的代理)。

public interface IProduct 
    { 
     void PerformService(); 
    } 

    public class ProductA : IProduct 
    { 
     public void PerformService() 
     { 
     Console.WriteLine("Product A's service."); 
     } 
    } 

    public class ProductB : IProduct 
    { 
     public void PerformService() 
     { 
     Console.WriteLine("Product B's service."); 
     } 
    } 

    public class ProductC : IProduct 
    { 
     public void PerformService() 
     { 
     Console.WriteLine("Product C's service."); 
     } 
    } 

    abstract class ProductFactory 
    { 
     public abstract IProduct CreateProduct(int count); 
    } 

    class OriginalFactory : ProductFactory 
    { 
     public override IProduct CreateProduct(int count) 
     { 
     if (count < 10) 
     { 
      return new ProductA(); 
     } 
     else if (count == 10) 
     { 
      return new ProductB(); 
     } 
     else if (count > 10) 
     { 
      return new ProductC(); 
     } 
     else 
     { 
      return null; 
     } 
     } 
    } 

    class NewFactory : ProductFactory 
    { 
     public override IProduct CreateProduct(int count) 
     { 
     if (count < 20) 
     { 
      return new ProductA(); 
     } 
     else if (count == 20) 
     { 
      return new ProductB(); 
     } 
     else if (count > 20) 
     { 
      return new ProductC(); 
     } 
     else 
     { 
      return null; 
     } 
     } 
    } 

    public class FactoryTest 
    { 
     public void TestNew() 
     { 
     ProductFactory factory = new NewFactory(); 
     IProduct product = factory.CreateProduct(10); // Product B 
     product.PerformService(); 
     } 
     public void TestOld() 
     { 
     ProductFactory factory = new OriginalFactory(); 
     IProduct product = factory.CreateProduct(10); // Product A 
     product.PerformService(); 
     } 
    }