设计模式 2 抽象工厂模式

设计模式 2

  • 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
  • 结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式
  • 行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

文章目录

  • 设计模式 2
    • 抽象工厂模式(Abstract Factory Pattern)
      • 1 定义
      • 2 结构
      • 3 示例代码
      • 4 特点
      • 5 适用场景
      • 6 比较总结

抽象工厂模式(Abstract Factory Pattern)

1 定义

抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。它适用于需要创建多个产品族的情况。

2 结构

抽象工厂模式包含以下角色:

  • 抽象工厂(AbstractFactory): 声明创建一系列相关对象的接口。
  • 具体工厂(ConcreteFactory): 实现抽象工厂中的创建方法,生成具体产品。
  • 抽象产品(AbstractProduct): 为每种产品声明接口。
  • 具体产品(ConcreteProduct): 定义由具体工厂创建的产品对象,必须实现抽象产品接口。

UML 类图

       +-------------------------+
       |      AbstractFactory     |
       +-------------------------+
       | + CreateProductA()       |
       | + CreateProductB()       |
       +-------------------------+
                /|\
                 |
       +-------------------------+
       |   ConcreteFactory1       |
       +-------------------------+
       | + CreateProductA()       |
       | + CreateProductB()       |
       +-------------------------+
                 |
       +-------------------------+
       |   ConcreteFactory2       |
       +-------------------------+
       | + CreateProductA()       |
       | + CreateProductB()       |
       +-------------------------+
                /|\
                 |
+----------------------------+  +----------------------------+
|        AbstractProductA     |  |        AbstractProductB     |
+----------------------------+  +----------------------------+
| + OperationA()              |  | + OperationB()              |
+----------------------------+  +----------------------------+
                /|\                          /|\
                 |                            |
+----------------------------+  +----------------------------+
|        ProductA1           |  |        ProductB1           |
+----------------------------+  +----------------------------+
| + OperationA()              |  | + OperationB()              |
+----------------------------+  +----------------------------+
                 |
+----------------------------+
|        ProductA2           |
+----------------------------+
| + OperationA()              |
+----------------------------+

3 示例代码

假设我们要创建两种风格的家具:现代风格和维多利亚风格,每种风格包括椅子和沙发。我们可以使用抽象工厂模式来实现。

// 抽象产品A:椅子
public interface IChair
{
    void SitOn();
}

// 抽象产品B:沙发
public interface ISofa
{
    void LieOn();
}

// 具体产品A1:现代椅子
public class ModernChair : IChair
{
    public void SitOn()
    {
        Console.WriteLine("Sitting on a modern chair.");
    }
}

// 具体产品B1:现代沙发
public class ModernSofa : ISofa
{
    public void LieOn()
    {
        Console.WriteLine("Lying on a modern sofa.");
    }
}

// 具体产品A2:维多利亚椅子
public class VictorianChair : IChair
{
    public void SitOn()
    {
        Console.WriteLine("Sitting on a Victorian chair.");
    }
}

// 具体产品B2:维多利亚沙发
public class VictorianSofa : ISofa
{
    public void LieOn()
    {
        Console.WriteLine("Lying on a Victorian sofa.");
    }
}

// 抽象工厂
public interface IFurnitureFactory
{
    IChair CreateChair();
    ISofa CreateSofa();
}

// 具体工厂1:现代家具工厂
public class ModernFurnitureFactory : IFurnitureFactory
{
    public IChair CreateChair()
    {
        return new ModernChair();
    }

    public ISofa CreateSofa()
    {
        return new ModernSofa();
    }
}

// 具体工厂2:维多利亚家具工厂
public class VictorianFurnitureFactory : IFurnitureFactory
{
    public IChair CreateChair()
    {
        return new VictorianChair();
    }

    public ISofa CreateSofa()
    {
        return new VictorianSofa();
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        IFurnitureFactory modernFactory = new ModernFurnitureFactory();
        IChair modernChair = modernFactory.CreateChair();
        ISofa modernSofa = modernFactory.CreateSofa();
        modernChair.SitOn();
        modernSofa.LieOn();

        IFurnitureFactory victorianFactory = new VictorianFurnitureFactory();
        IChair victorianChair = victorianFactory.CreateChair();
        ISofa victorianSofa = victorianFactory.CreateSofa();
        victorianChair.SitOn();
        victorianSofa.LieOn();
    }
}

4 特点

  • 优点:
    • 遵循开放-关闭原则:可以通过添加新的具体工厂来扩展产品家族,而不修改现有代码。
    • 保证产品族的一致性:所有由同一具体工厂创建的产品都是相互兼容的。
  • 缺点:
    • 复杂度较高:随着产品族和具体产品的增加,类的数量会显著增加。
    • 扩展困难:增加新的产品族时,必须修改抽象工厂及其子类,这违反了开放-关闭原则。

5 适用场景

  • 当系统要创建多个产品族的对象时。
  • 当你需要确保一个产品族中的所有对象是兼容的时。
  • 当产品族的创建逻辑较为复杂,需要封装起来时。

6 比较总结

  • 工厂方法模式:
    • 适用于创建单一产品的场景。
    • 通过子类化具体创建者来扩展产品类型。
    • 工厂方法模式更关注的是"如何创建"一个对象。
  • 抽象工厂模式:
    • 适用于创建多个相关产品的场景。
    • 通过增加新的具体工厂来扩展产品族。
    • 抽象工厂模式更关注的是"创建什么"(一系列相关的对象)。

在实际应用中,工厂方法模式较适合较简单的对象创建场景,而抽象工厂模式则适合更复杂的、多产品族的对象创建需求。

你可能感兴趣的:(#,设计模式,设计模式,抽象工厂模式)