抽象工厂模式 比工厂模式具有更高层次的抽象性,当要返回一系列相关类中的某一格,而对每个类都能根据需要返回不同的对象时候,这种模式就派上了用场。换言之,抽象工厂是一个工厂对象。它能返回一系列相关类中的某一格,可以用简单工厂决定哪一个类。
下面这个例子作为抽象工厂模式的例子,希望能跟大家一起分享一起进步。
如果我们接到这样一个任务,让我们来设计一个花园,通常我们会先大概了解这个花园的主题是什么呢,是水果型花园,还是蔬菜型花园,或者花卉型花园呢?知道这些,接下来我们就会具体考虑花园各个部位种植什么,使得我们的花园层次分明,凸现我们设计者的个性,为了简化问题,我们不凡假设花园总分三部位,中间部位,边缘部位,阴凉部位。了解了这些任务需求,那我们就动手写code吧。
第一步: 第二步:
//
定义植物类
public class Plant
{
private string name;//
植物名字
public Plant(string pname)
{
name=pname;
}
public string getName()
{
return name;
}
}
//
定义花园类
public class Garden
{
protected Plant center,shade,border;//
公园不同的部位种植的植物将会不同
protected bool showCenter,showShade,showBorder;//
决定是否显示
//----------
public void setCenter(Label lb)
{
showCenter=true;
lb.Text=getResult();
}
public void setShade(Label lb)
{
showShade=true;
lb.Text=getResult();
}
public void setBorder(Label lb)
{
showBorder=true;
lb.Text=getResult();
}
public string getResult()
{
string temp="";
if (showBorder) temp+="<BR>
边缘种植:"+border.getName();
if (showShade) temp+="<BR>
阴凉处种植:"+shade.getName();
if (showCenter) temp+="<BR>
中间种植:"+center.getName();
return temp;
}
}
第三步:
//花园类的派生类蔬菜型花园
public class VeggieGarden:Garden
{
public VeggieGarden()
{
shade=new Plant("白菜");
center=new Plant("青菜");
border=new Plant("菠菜");
}
}
//花园类的派生类水果型花园
public class FruitGarden:Garden
{
public FruitGarden()
{
shade=new Plant("苹果");
center=new Plant("西瓜");
border=new Plant("橘子");
}
}
//花园类的派生类花卉型花园
public class FlowerGarden:Garden
{
public FlowerGarden()
{
shade=new Plant("牡丹");
center=new Plant("玫瑰");
border=new Plant("荷花");
}
}
第四步:按钮事件使用抽象工厂模式
private
void Button6_Click(object sender, System.EventArgs e)
{
Garden garden;
if (opFruitGarden.Checked)
{
garden=new FruitGarden();
}
else if(opFlowerGarden.Checked)
{
garden=new FlowerGarden();
}
else
{
garden=new VeggieGarden();
}
if(ckBorder.Checked)
garden.setBorder(lbGardenResult);
if(ckCenter.Checked)
garden.setCenter(lbGardenResult);
if(ckShade.Checked)
garden.setShade(lbGardenResult);
}
结果显示: