详解C#的设计模式编程之抽象工厂模式的应用

2019-12-26 18:01:29王振洲
易采站长站为您分析C#的设计模式编程之抽象工厂模式的应用,注意区分一下简单工厂模式、工厂方法模式和抽象工厂模式概念之间的区别,需要的朋友可以参考下  

这里首先以一个生活中抽象工厂的例子来实现一个抽象工厂,然后再给出抽象工厂的定义和UML图来帮助大家更好地掌握抽象工厂模式,同时大家在理解的时候,可以对照抽象工厂生活中例子的实现和它的定义来加深抽象工厂的UML图理解。抽象工厂模式比其它工厂模式更加抽象,抽象工厂模式适用与多个抽象类的情况下,通过工厂返回多个抽象类中你需要得到的具体子类实例。

抽象工厂模式比其它工厂模式更加抽象,抽象工厂模式适用与多个抽象类的情况下,通过工厂返回多个抽象类中你需要得到的具体子类实例。

举例阐述抽象工厂模式:
假如中国对邪恶国家开战。

中国装备:炸弹类,坦克类,来消灭邪恶国家。

炸弹类:导弹,核弹;

坦克类:越野车,主站坦克;

战略:

前期中国兵工厂生产:导弹,越野车,打击邪恶国家。

后期中国兵工厂生产:核弹,主站坦克,毁灭邪恶国家。

类图: 

详解C#的设计模式编程之抽象工厂模式的应用

装备类代码:


  #region 炸弹系列
  abstract class Bomb
  {
    abstract public void baozha();
  }
  /// <summary>
  /// 导弹
  /// </summary>
  class daodanBomb :Bomb
  {
    public override void baozha()
    {
      Console.WriteLine("我是一颗中国造导弹,来轰炸不老实的小邪恶国家!");
    }
  }
  /// <summary>
  /// 核弹
  /// </summary>
  class hedanBomb : Bomb
  {
    public override void baozha()
    {
      Console.WriteLine("我是一颗中国造核弹,来轰炸不老实的小邪恶国家!");
    }
  }
  #endregion

  #region 坦克系列
  abstract class Tank
  {
    abstract public void go();
  }
  /// <summary>
  /// 越野车
  /// </summary>
  class yueyeTank : Tank
  {
    public override void go()
    {
      Console.WriteLine("我是一颗中国造越野车,来踏平不老实的小邪恶国家!");
    }
  }
  /// <summary>
  /// 主站坦克
  /// </summary>
  class zhuzhanTank : Tank
  {
    public override void go()
    {
      Console.WriteLine("我是一颗中国造主站坦克,来踏平不老实的小邪恶国家!");
    }
  }
  #endregion工厂类代码


  #region 中国兵工厂
  abstract class chinaFactory
  {
    //装甲车制造车间
    public abstract Tank CreateTank();
    //炸弹知道车间
    public abstract Bomb CreateBomb();
  }
  //兵工厂前期制造
  class qianqiFactory : chinaFactory
  {   
    public override Bomb CreateBomb()
    {
      //导弹
      return new daodanBomb();
    }
    public override Tank CreateTank()
    {
      //越野车
      return new yueyeTank();
    }
  }
  //兵工厂后期制造
  class houqiFactory : chinaFactory
  {
    public override Bomb CreateBomb()
    {
      //核弹
      return new hedanBomb();
    }
    public override Tank CreateTank()
    {
      //主站坦克
      return new zhuzhanTank();
    }
  }
  #endregion客户端代码:(打仗)


  // 备战
  class Make
  {
    //装备 
    private Bomb bomb;
    private Tank tank;
    //制造加工
    public Make(chinaFactory factory)
    {
      bomb = factory.CreateBomb();
      tank = factory.CreateTank();
    }

    //开始打仗
    public void warStar()
    {
      //炸弹类爆炸
      bomb.baozha();
      //战车类前进
      tank.go();
    }

  }
  public class start
  {
    public static void Main()
    {
      //大战前期
      chinaFactory qianqiMake = new qianqiFactory();
      Make qianqi = new Make(qianqiMake);
      qianqi.warStar();

      //点任意键,进行后期攻势!!
      Console.ReadKey();

      //大战后期
      chinaFactory houqiMake = new houqiFactory();
      Make houqi = new Make(houqiMake);
      houqi.warStar();

      Console.WriteLine("钓鱼岛是中国的,神圣不可侵犯!小邪恶国家,滚开!!");
      Console.ReadLine();
    }
  }