1、概述:

  抽象工厂和前面讲过的工厂模式很类似,工厂模式是针对一类产品的,比如说,运算类,加、减、剩、除都集成自运算基类,我们把这些统称为一类产品,并且对应的子产品实现方式就一种,这时候可以使用工厂模式,如果改变一下,比如上面说的运算类,如果对于每个子产品类都有两种不同的实现方式,这时候,就需要抽象出两个基类,这时候就需要用到抽象工厂了,简单的说,工厂模式是生产一种产品的,而抽象工厂是生产两种或两种以上的产品的模式。

2、定义:

  提供一个创建一系列相关或相互依赖对象的借口,而无需指定它们具体的类。

3、UML类图:

 

4、示例:

  这里我用生产汽车的示例,汽车分为小汽车和长途汽车等,而生产汽车的厂家有宝马、奔驰等。抽象工厂中,宝马、奔驰等就是对产品小汽车和长途汽车两种产品的不同生产方式,这里采用反射的方式举个示例:

  产品类型:

  interface ICar

  {

    void ShengChanCar();

  }

  interface IBus

  {

    void ShengChanBus();

  }

  具体产品子类:

  class BaoMaCar:ICar

  {

     public void ShengChanCar()

    {

      Console.WriteLine("宝马公司生产的小汽车");

    }

  }

  class BenChiCar:ICar

  {

     public void ShengChanCar()

    {

      Console.WriteLine("奔驰公司生产的小汽车");

    }

  }

class BaoMaBus:IBus  

{

    public void ShengChanBus()

    {

      Console.WriteLine("宝马公司生产的长途汽车");

    }

  }

  class BenChiBus:IBus

  {

     public void ShengChanBus()

    {

      Console.WriteLine("奔驰公司生产的长途汽车");

    }

  }

  工厂类:

  interface IFactory

  {

    ICar ShengChanCar();

    IBus ShengChanBus();

  }

  class BaoMaFactory:IFactory

  {

    ICar ShengChanCar()

    {

      return new BaoMaCar();

    }

    IBus ShengChanBus()

    {

      return new BaoMaBus();

    }

  }

 

class BenChiFactory:IFactory

  {

    ICar ShengChanCar()

    {

      return new BenChiCar();

    }

    IBus ShengChanBus()

    {

      return new BenChiBus();

    }

  }

客户端调用:

//需要奔驰工厂生产的小汽车

IFactory factory=new BenChiFactory();

ICar car =factory.ShengChanCar();

car.ShengChanCar();//生产汽车

如果要调用反射的方式,这时候就可以把工厂类省去了,示例代码如下:

class ShengChan

{

  public string qicheType ="Car";

  public string company ="BaoMa";

  ICar car =(ICar)Assembly.Load("当前程序集名称").CreateInstance("当前程序集名称."+company+qicheType);

  car.ShengChanCar();//生产汽车

}

posted on 2013-07-19 09:56  Kelly_HanShuai  阅读(124)  评论(0)    收藏  举报