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();//生产汽车
}
浙公网安备 33010602011771号