C#设计模式之抽象工厂模式

      抽象工厂模式 比工厂模式具有更高层次的抽象性,当要返回一系列相关类中的某一格,而对每个类都能根据需要返回不同的对象时候,这种模式就派上了用场。换言之,抽象工厂是一个工厂对象。它能返回一系列相关类中的某一格,可以用简单工厂决定哪一个类。

     下面这个例子作为抽象工厂模式的例子,希望能跟大家一起分享一起进步。

     如果我们接到这样一个任务,让我们来设计一个花园,通常我们会先大概了解这个花园的主题是什么呢,是水果型花园,还是蔬菜型花园,或者花卉型花园呢?知道这些,接下来我们就会具体考虑花园各个部位种植什么,使得我们的花园层次分明,凸现我们设计者的个性,为了简化问题,我们不凡假设花园总分三部位,中间部位,边缘部位,阴凉部位。了解了这些任务需求,那我们就动手写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);
         }
结果显示:

结果显示

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值