简单工厂不属于GOF23设计模式
简单工厂也是解决类的创建问题,他的实现可以描述为:通过将参数传入工厂类对应的方法中创建想要的对象。接下来对比在同一个需求场景下不是用简单工厂和使用简单工厂之前的区别。

场景: 不同的手机厂商生产不同的手机,我们根据需要使用不同手机完成打电话的动作。

1、创建手机类型及抽象

  1. /// <summary>
  2. /// 抽象手机类
  3. /// </summary>
  4. public abstract class AbstracPhone
  5. {
  6. /// <summary>
  7. /// 电话类型
  8. /// </summary>
  9. protected abstract string PhoneType { get;}
  10. /// <summary>
  11. /// 打电话
  12. /// </summary>
  13. public virtual void Call()
  14. {
  15. Console.WriteLine($"使用{PhoneType}打电话");
  16. }
  17. }

具体手机类,继承抽象类AbstractPhone

/// <summary>
/// 小米手机
/// </summary>
public class XiaoMi : AbstracPhone
{
    protected override string PhoneType => nameof(XiaoMi);
}
/// <summary>
/// 华为手机
/// </summary>
public class HuaWei : AbstracPhone
{
    protected override string PhoneType => nameof(HuaWei);
}
/// <summary>
/// 锤子手机
/// </summary>
public class CuiZi : AbstracPhone
{
    protected override string PhoneType => nameof(CuiZi);
}

2、不使用简单工厂

当我们不实用工厂时,对上面代码的应用,我们一般是通过New直接创建对应的手机类

AbstracPhone huaWei = new HuaWei();
huaWei.Call();
AbstracPhone xiaoMi = new XiaoMi();
xiaoMi.Call();

当直接使用上面的方式创建不同的手机对象时,不是不不可以。只是当我门在其他的业务中冗余了太多这样的创建细节的时候,我们也增加了类之间的聚合度,对后期代码的维护和扩展性是不方便的。所以我们会考虑将手机对象的创建细节封装在一个类中, 就是接下来要说的简单工厂。

3、使用简单工厂

UML类图:
image.png
我们统一上面的手机对象创建,放在一个叫做SimpleFactory的类当中,同时创建了一个枚举,提供传入手机类型的控制:

/// <summary>
/// 手机类型
/// </summary>
public enum PhoneTypeEnum
{
    HuaWei,
    XiaoMi,
    ChuiZi
}

对于简单工厂来讲, 通常都会把创建对象方法定义为静态的,这样更方便于上端调用。所以简单工厂也被称作: 静态工厂方法

public class SimpleFactory
{
    /// <summary>
    /// 统一根据传入手机类型创建手机对象
    /// </summary>
    /// <param name="phoneType"></param>
    /// <returns></returns>
    public static AbstracPhone CreatePhone(PhoneTypeEnum phoneType)
    {
        AbstracPhone phone = null;
        switch (phoneType)
        {
            case PhoneTypeEnum.HuaWei:
                phone = new HuaWei();
                break;
            case PhoneTypeEnum.XiaoMi:
                phone = new XiaoMi();
                break;
            case PhoneTypeEnum.ChuiZi:
                phone = new ChuiZi();
                break;
            default:
                break;
        }
        return phone;
    }
}

有了上面的工厂组织手机对象的创建,那使用的时候就如下:

AbstracPhone huaWei = SimpleFactory.CreatePhone(PhoneTypeEnum.HuaWei);
huaWei.Call();
AbstracPhone xiaoMi = SimpleFactory.CreatePhone(PhoneTypeEnum.XiaoMi);
xiaoMi.Call();

有了上面的工厂进行对象创建的封装, 虽然在调用上并没有多大的简单性可言,甚至可以说还没有以前方便。但是当我们把对象的创建细节交由工厂以后,以后对象创建方式的变化对使用者来讲是毫无影响的,而且统一在一个工厂类中进行修改,也方便了维护,不用在各个使用的地方到处去修改了。 所以从长远来看,使用简单工厂肯定是有好处的。

4、简单工厂的优缺点

优点:
(1)简单粗暴,封装在一起,方便维护。
缺点:
(1)当所要产生的对象非常多时,工厂方法的代码量可能会很庞大。(一般不存在)。
(2)简单工厂对于增加新的产品,只能通过修改工厂方法来实现。不满足开闭原则。