您好我是新手设计模式并道歉如果这个问题造成任何混乱,虽然我试图以最佳方式描述问题。我已经在winforms中实现了样本抽象工厂模式。前端包含两个用于创建对象的复选框。注意:如果同时选中该复选框,则会创建两个对象。 我正在使用objs.CreateProduct(Maxima,Ultima)方法并传递布尔值来创建对象。在这里,我传递两个属性的值,无论我是想为最终或最大值创建对象。您能否提出其他更好的方法来实现这一目标?如果我正在创建对象,我不想传递maxima和ultima的属性。
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 :(得分: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();
}
}
答案 1 :(得分:0)
工厂基类接口应该允许客户端仅基于提供给其create
方法的参数来创建任何类型的后代实例。重点是将对象创建与特定具体类型的知识分离,以便允许例如依赖注入。
如果要为各种后代工厂提供不同的初始化数据,那么这些数据应该包含在工厂类中或提供给工厂类本身(因为无论代码是什么,创建和配置工厂都是应该了解具体类型的唯一部分)。因此,使用B
和Ultima
的bool值初始化C
,其值为Maxima
。
坦率地说,你可能对你的例子进行了过多的编辑:我不确定你想要做什么。如果WinForms代码应该不知道具体类型,那么您需要在它和工厂创建代码之间引入某种解耦接口,以便传递初始化数据。