2010-07-15 138 views
0

您好我是新來設計模式和道歉,如果這個問題是造成任何混淆,雖然我想以最好的方式來描述問題。我已經實現了示例抽象工廠模式的WinForms。前端包含兩個複選框來創建對象。注意:如果同時選中該複選框,則會創建這兩個對象。 我正在使用objs.CreateProduct(Maxima,Ultima)方法並傳遞布爾值來創建對象。在這裏,我傳遞了這兩個屬性的值,無論我是否想要爲ultima或maxima創建對象。你能否提出其他更好的方法來實現這一目標?如果我正在創建對象,我不想傳遞maxima和ultima的屬性。抽象工廠設計模式c#

public partial class Form1 : Form 
    { 
     public bool Maxima 
     { 
      get; 
      set; 
     } 

     public bool Ultima 
     { 
      get; 
      set; 
     } 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Factory[] obj = new Factory[2]; 
      obj[0] = new B(); 
      obj[1] = new C(); 

      foreach (Factory objs in obj) 
      { 
       iProduct prod = objs.CreateProduct(Maxima,Ultima); 
       if (prod != null) 
       { 
        prod.GetDetails(); 
       } 
      } 

     } 

     private void checkBox1_CheckedChanged(object sender, EventArgs e) 
     { 
      if (checkBox2.Checked) 
       Maxima = true; 
       else 
       Maxima = false; 

      if (checkBox1.Checked) 
       Ultima = true; 
      else 
       Ultima = false; 
     } 
    } 


    abstract class Factory 
    { 
     public abstract iProduct CreateProduct(bool maxima, bool ultima); 
    } 

    class B : Factory 
    { 
     public override iProduct CreateProduct(bool maxima,bool ultima) 
     { 
      if (ultima) 
      { 
       return new NissanUltima(); 
      } 
      else return null; 
     } 
    } 

    class C : Factory 
    { 
     public override iProduct CreateProduct(bool maxima,bool ultima) 
     { 
      if (maxima) 
      { 
       return new NissanMaxima(); 
      } 
      else return null; 
     } 
    } 

    interface iProduct 
    { 
     void GetDetails(); 
    } 

    class NissanUltima:iProduct 
    { 

     public void GetDetails() 
     { 
      MessageBox.Show("NissanUltima is created"); 
     } 

    } 

    class NissanMaxima:iProduct 
    { 
     public void GetDetails() 
     { 
      MessageBox.Show("NissanMaxima is created"); 
     } 
    } 

回答

0

一個工廠基類的接口應該允許客戶創建任何類型的後代實例,僅基於提供給其create方法的參數。整個觀點是將對象創建與特定具體類型的知識分離,以便允許依賴注入。

如果你想爲不同的後代工廠提供不同的初始化數據,這些數據應該包含在工廠類本身中或提供給工廠類本身(因爲任何代碼創建和配置工廠是應該知道具體的唯一部分類型)。因此,用UltimaC的bool值初始化B,其值爲Maxima

坦率地說,你可能已經編輯過你的例子太多了:我不確定你想要做什麼。如果WinForms代碼不應該意識到具體的類型,那麼您需要在它和您的工廠創建代碼之間引入某種解耦接口,以便傳遞初始化數據。

1

我建議重新設計該代碼。抽象工廠是在你的樣本中創建一個抽象產品,例如汽車。一個特定的工廠添加了產品的一個特點。比方說Nissanfactory和Fordfactory 然後在每個CreateFactory()中,您可以對您想要創建的汽車模型進行描述。

abstract class Factory 
{ 
    public abstract iProduct CreateProduct(int Model); 
} 

class NissanFactory : Factory 
{ 
    public override iProduct CreateProduct(int Model) 
    { 
     // say 1 is Maxima 
     //say 2 is Untima 
     if (Model ==1) 
     { 
      return new NissanMaxima(); 
     } 
     if(Model ==2) 
     { 
      return new NissanUltima(); 

     } 
     return null; 
    } 
} 

class FordFartory : Factory 
{ 
    public override iProduct CreateProduct(int Model) 
    { 
     if (Model == 1) 
     { 
      return new GrandTorino(); 
     } 
     if (Model == 2) 
     { 
      return new Mustang(); 

     } 
     return null; 
    } 
} 

//

private void button1_Click(object sender, EventArgs e) 
    { 


     Factory[] obj = new Factory[1]; 
      obj[0] =new NissanFactory(); 

     private List<iProduct> products = new List<iProduct>(); 

     //create maxima if it's chacked 
     if (checkBox2.Checked) 
      products.Add(obj.CreateProduct(1)); 

     //create ultima 
     if (checkBox1.Checked) 
      products.Add(prod = obj.CreateProduct(2)); 

     //now you can navigate via list of created products 
     foreach (IProduct car in products) 
     { 


       prod.GetDetails(); 

     } 

    } 
+0

我可以理解,但我想在點擊按鈕創建類(僅當複選框被選中)的對象,這就是爲什麼我已經使用循環並更改checkchanged上的屬性。你能否建議在你的情況下這是否可行? – user359562 2010-07-15 10:05:16

+0

@ user359562查看我的更改 – Arseny 2010-07-15 10:26:07

+0

感謝Arseny爲您提供快速響應。 – user359562 2010-07-15 11:17:53