Jupyter AI

23 设计模式在C#中的应用之工厂模式

📅 发表日期: 2024年8月13日

分类: 🔷C# 高级

👁️阅读: --

在前一篇文章中,我们深入探讨了单例模式的应用,了解了如何确保一个类只有一个实例并提供全局访问。在本篇中,我们将聚焦于另一种重要的设计模式——工厂模式。这种模式在创建对象方面提供了一种灵活的解决方案,使得代码更加模块化,易于维护和扩展。

什么是工厂模式?

工厂模式是一种创建型设计模式,主要负责实例化对象。它通过定义一个接口或抽象类来创建对象,从而允许子类决定实例化哪个类。工厂模式将对象的创建与使用分离,使得代码结构更加清晰。

工厂模式通常分为三种类型:

  • 简单工厂模式(虽然严格来说不是一个设计模式)
  • 工厂方法模式
  • 抽象工厂模式

在本篇中,我们将重点讨论简单工厂模式工厂方法模式

简单工厂模式

简单工厂模式的核心是一个工厂类,可以根据提供的信息创建不同的对象。下面是一个示例。

示例:简单工厂模式

假设我们要创建一个简单的图形应用程序,可以绘制多种形状,比如CircleSquare

// 产品接口
public interface IShape
{
    void Draw();
}

// 具体产品 - 圆形
public class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a Circle");
    }
}

// 具体产品 - 正方形
public class Square : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a Square");
    }
}

// 工厂类
public class ShapeFactory
{
    public static IShape GetShape(string shapeType)
    {
        switch (shapeType.ToLower())
        {
            case "circle":
                return new Circle();
            case "square":
                return new Square();
            default:
                throw new ArgumentException("Shape type not recognized");
        }
    }
}

// 使用工厂
class Program
{
    static void Main(string[] args)
    {
        IShape shape1 = ShapeFactory.GetShape("circle");
        shape1.Draw();  // 输出: Drawing a Circle

        IShape shape2 = ShapeFactory.GetShape("square");
        shape2.Draw();  // 输出: Drawing a Square
    }
}

在上述示例中,ShapeFactory负责创建具体的形状对象。通过传递形状的类型,调用者可以获取所需的对象,而无需了解具体实现。

工厂方法模式

与简单工厂模式不同,工厂方法模式为每个产品定义一个创建的接口,允许子类决定实例化哪个类。通过这种方式,工厂方法模式提供了更高的灵活性和可扩展性。

示例:工厂方法模式

让我们修改之前的例子,使用工厂方法模式创建不同形状的工厂。

// 产品接口
public interface IShape
{
    void Draw();
}

// 具体产品 - 圆形
public class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a Circle");
    }
}

// 具体产品 - 正方形
public class Square : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a Square");
    }
}

// 工厂接口
public interface IShapeFactory
{
    IShape CreateShape();
}

// 具体工厂 - 圆形工厂
public class CircleFactory : IShapeFactory
{
    public IShape CreateShape()
    {
        return new Circle();
    }
}

// 具体工厂 - 正方形工厂
public class SquareFactory : IShapeFactory
{
    public IShape CreateShape()
    {
        return new Square();
    }
}

// 使用工厂方法
class Program
{
    static void Main(string[] args)
    {
        IShapeFactory circleFactory = new CircleFactory();
        IShape circle = circleFactory.CreateShape();
        circle.Draw();  // 输出: Drawing a Circle

        IShapeFactory squareFactory = new SquareFactory();
        IShape square = squareFactory.CreateShape();
        square.Draw();  // 输出: Drawing a Square
    }
}

在这个示例中,每种形状都有一个专属的工厂。通过工厂接口IShapeFactory,我们实现了对具体工厂的抽象。这使得我们能够轻松扩展,例如添加新的形状产品和对应的工厂,而不需要修改现有代码。

总结

在本篇中,我们详细探讨了工厂模式及其在C#中的实现。我们了解了简单工厂模式和工厂方法模式,并通过示例代码展示了如何使用这些模式创造灵活和可扩展的代码结构。工厂模式尤其适用于需要创建多个相关或相似对象的场景,从而达到降低耦合度、提高代码可维护性的目的。

在下一篇文章中,我们将继续探讨观察者模式,了解如何在对象之间建立一种一对多的依赖关系,以便在一个对象的状态改变时自动通知所有依赖于它的对象。在这个模式中,您将看到如何处理多方交互,同时保持组件之间的低耦合性。敬请期待!