陈巧倩

设计模式-工厂方法模式

· 190 words · 1 minutes to read
Categories: CSharp
Tags: Design Pattern

Factory Method Pattern工厂方法模式,定义了一个用于创建对象的接口,但让子类决定实例化哪个类。此模式让类将实例化延迟到子类。

Design Pattern:Factory Method 🔗

基本介绍 🔗

构成 🔗

  • Creator:抽象工厂,定义工厂所有的操作接口,包括创建Product类型方法,所有ConcreteCreator都必须继承Creator类。
  • ConcreteCreator:实际工厂,实现Creator类定义的抽象方法,用来创建实际产品。
  • Product:抽象产品,定义产品所有的操作接口,所有ConcreteProduct都必须继承Product类。
  • ConcreteProduct:实际产品,实现Product类定义的抽象方法。

优点 🔗

  • 用户只需要知道所要产品的具体工厂,无须关系具体的创建过程。
  • 增加新产品时,只需定义自己的实际产品和实际工厂,无需对旧工厂进行修改,更符合开闭原则。

缺点 🔗

  • 代码变得复杂,因为您创建了越来越多的类来实现该模式。

实例 🔗

C#中工厂方法模式的实例,下面我们又来到了富士康的手机装配车间。

  • Creator
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class Factory
{
    // 工厂方法
    public abstract Phone CreatePhone();
}
  • ConcreteCreator
/// <summary>
/// 生产华为手机工厂
/// </summary>
public class HuaweiPhoneFactory : Factory
{
    /// <summary>
    /// 生产华为手机
    /// </summary>
    /// <returns></returns>
    public override Phone CreatePhone()
    {
        return new HuaweiPhone();
    }
}

/// <summary>
/// 生产苹果手机工厂
/// </summary>
public class PingGuoFactory : Factory
{
    /// <summary>
    /// 生产苹果手机
    /// </summary>
    /// <returns></returns>
    public override Phone CreatePhone()
    {
        return new PingGuoPhone();
    }
}
  • Product
/// <summary>
/// 手机抽象类
/// </summary>
public abstract class Phone
{
    // 打电话
    public abstract void Call();
}
  • ConcreteProduct
/// <summary>
/// 华为手机
/// </summary>
public class HuaweiPhone : Phone
{
    public override void Call()
    {
        Console.WriteLine("我在用华为手机给你打电话!");
    }
}

/// <summary>
/// 苹果手机
/// </summary>
public class PingGuoPhone : Phone
{
    public override void Call()
    {
        Console.WriteLine("我在用苹果手机给你打电话!");
    }
}

实际运行:

// 初始化创建手机的两个工厂
Factory huaweiPhoneFactory = new HuaweiPhoneFactory();
Factory pingGuoPhoneFactory = new PingGuoPhoneFactory();

// 生产一部华为手机
Phone huawei = huaweiPhoneFactory.CreatePhone();
huawei.Call();

//生产一部苹果手机
Phone pingguo = pingGuoPhoneFactory.CreatePhone();
pingguo.Call();

结论 🔗

搬砖愉快!