一、引言
从简单工厂模式->工厂模式->抽象工厂模式,都是为了克服之前的一些缺点而设计的。工厂方法模式具有很好的可扩展性,但是一个工厂只创建单个产品这样的例子很少,常常需要创建多个系列的产品。抽象工厂能很好地解决一系列产品创建的问题。
二、实现示例
抽象工厂示例
#region 自己写的抽象工厂
/// <summary>
/// 抽象工厂,将所有设备抽象出来
/// </summary>
public interface IEquipAbstractFactory
{
ICamera CreateCamera();
IRadar CreateRadar();
}
/// <summary>
/// 摄像头接口
/// </summary>
public interface ICamera : IEquip
{
new string GetName();
}
/// <summary>
/// 卫星定位设备接口
/// </summary>
public interface IRadar : IEquip
{
new string GetName();
}
/// <summary>
/// 第一个航行器
/// </summary>
public class FirstVehicleFactory: IEquipAbstractFactory
{
public ICamera CreateCamera()
{
return new HikVision();
}
public IRadar CreateRadar()
{
return new LaserRadar();
}
}
public class HikVision: ICamera
{
public string GetName()
{
return nameof(HikVision);
}
}
public class LaserRadar : IRadar
{
public string GetName()
{
return nameof(LaserRadar);
}
}
#endregion
新增工厂
/// <summary>
/// 现在增加第二个航行器
/// </summary>
public class SecondVehicleFactory : IEquipAbstractFactory
{
public ICamera CreateCamera()
{
return new Uniview();
}
public IRadar CreateRadar()
{
return new MillimeterWaveRadar();
}
}
public class Uniview : ICamera
{
public string GetName()
{
return nameof(Uniview);
}
}
public class MillimeterWaveRadar : IRadar
{
public string GetName()
{
return nameof(MillimeterWaveRadar);
}
}
调用示例
public class AbstractFactoryClient
{
public static void Test()
{
IEquipAbstractFactory e1 = new FirstVehicleFactory();
var c1 = e1.CreateCamera();
var r1 = e1.CreateRadar();
string tmp = "";
tmp = c1.GetName();
Console.WriteLine(tmp);
tmp = r1.GetName();
Console.WriteLine(tmp);
IEquipAbstractFactory e2 = new SecondVehicleFactory();
var c2 = e2.CreateCamera();
var r2 = e2.CreateRadar();
tmp = c2.GetName();
Console.WriteLine(tmp);
tmp = r2.GetName();
Console.WriteLine(tmp);
}
}
三、分析
优点:
抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展
缺点:
抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。
场景(前提):
- 1、一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
- 2、这个系统有多个系列产品,而系统中只消费其中某一系列产品
- 3、系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。