一、引言
简单工厂模式的缺点中,有一条是:添加新产品时必须修改简单工厂方法,可能会造成简单工厂的实现逻辑过于复杂。工厂方法模式可以解决这个问题。
其它设计模式可以参考设计模式总结
完整示例可以参考我的GitHub
二、实现示例
这是在简单工厂的教程里,我们定义了设备抽象接口和设备类
/// <summary>
/// 设备抽象接口
/// </summary>
public interface IEquip
{
string GetName();
}
/// <summary>
/// GPS设备
/// </summary>
public class Gps : IEquip
{
public string GetName()
{
return nameof(Gps);
}
}
/// <summary>
/// 惯性测量单元设备
/// </summary>
public class IMU : IEquip
{
public string GetName()
{
return nameof(IMU);
}
}
这里新增一个设备创建的抽象类和两个设备创建的工厂类,就变成了一个工厂方法模式
public interface IEquipCreator
{
IEquip CreateFactory();
}
/// <summary>
/// gps的工厂方法
/// </summary>
public class GpsFactory : IEquipCreator
{
public IEquip CreateFactory()
{
return new Gps();
}
}
/// <summary>
/// 惯性测量单元的工厂方法
/// </summary>
public class IMUFactory : IEquipCreator
{
public IEquip CreateFactory()
{
return new IMU();
}
}
工厂方法模式下如果需要新增设备,这里给了新增摄像头设备的示例
public class CameraFactory : IEquipCreator
{
public IEquip CreateFactory()
{
return new Camera();
}
}
/// <summary>
/// 摄像头设备
/// </summary>
public class Camera : IEquip
{
public string GetName()
{
return nameof(Camera);
}
}
调用示例
IEquipCreator IEC;
string str1;
//已经有了gps和imu类
IEC = new GpsFactory();
IEquip _gps = IEC.CreateFactory();
str1 = _gps.GetName();
Invoke(new show(showTextbox), new object[] { str1 });
IEC = new IMUFactory();
IEquip _imu = IEC.CreateFactory();
str1 = _imu.GetName();
Invoke(new show(showTextbox), new object[] { str1 });
//现在新增camera类,新增和调用时都不需要对原有类进行修改
IEC = new CameraFactory();
IEquip _camera = IEC.CreateFactory();
str1 = _camera.GetName();
Invoke(new show(showTextbox), new object[] { str1 });
三、分析
使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。简单工厂模式中则需要修改工厂类中的实现(具体指添加case语句)。
四、总结
工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)。