抽象工厂模式(AbstractFactoryPattern)

发布于:2024-05-20 ⋅ 阅读:(169) ⋅ 点赞:(0)

1.抽象工厂模式定义

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

2.UML类图

在这里插入图片描述

  • 抽象工厂:声明了创建抽象产品对象的操作接口。
  • 具体产品工厂:实现了抽象工厂的接口,负责创建产品对象。
  • 产品抽象类或接口:定义一类产品对象的接口。
  • 具体产品实现:定义一个将被相应具体工厂创建的产品对象。

3.抽象工厂模式具体实现

本文基于生产电脑周边产品的例子

工厂模式实现单一产品族

public abstract class Keyboard 
{
    // 生产键盘
    public abstract void Create();
}

public class HPKeyboard : Keyboard
{
    public override void Create()
    {
        Console.WriteLine("生产惠普键盘");
    }
}

public class DellKeyboard : Keyboard
{
    public override void Create()
    {
        Console.WriteLine("生产戴尔键盘");
    }
}

public class LenovoKeyboard : Keyboard
{
    public override void Create()
    {
        Console.WriteLine("生产联想键盘");
    }
}

// 键盘工厂抽象类
public abstract class KeyboardFactory
{
    // 取得键盘实例
    public abstract Keyboard GetInstance();
}

public class HPKeyboardFactory : KeyboardFactory
{
    public override Keyboard GetInstance()
    {
        return new HPKeyboard();
    }
}

public class DellKeyboardFactory : KeyboardFactory
{
    public override Keyboard GetInstance()
    {
        return new DellKeyboard();
    }
}

public class LenoveKeyboardFactory : KeyboardFactory
{
    public override Keyboard GetInstance()
    {
        return new LenovoKeyboard();
    }
}

使用:

// 生产惠普键盘
new HPKeyboardFactory().GetInstance().Create();
// 生产戴尔键盘
new DellKeyboardFactory().GetInstance().Create();
// 生产联想键盘
new LenoveKeyboardFactory().GetInstance().Create();

抽象工厂实现多产品族

产品类

// 鼠标抽象类
public abstract class Mouse
{
    public abstract void Create();
}

public class DellMouse : Mouse
{
    public override void Create()
    {
        Console.WriteLine("生产戴尔鼠标");
    }
}

public class HPMouse : Mouse
{
    public override void Create()
    {
        Console.WriteLine("生产惠普鼠标");
    }
}

// 显示器抽象类
public abstract class Monitor
{
    public abstract void Create();
}

public class DellMonitor : Monitor
{
    public override void Create()
    {
        Console.WriteLine("生产戴尔显示器");
    }
}

public class HPMonitor : Monitor
{
    public override void Create()
    {
        Console.WriteLine("生产惠普显示器");
    }
}

工厂类

// 工厂抽象类。工厂分为Dell工厂和HP工厂,各自负责品牌内产品的创建
public abstract class Factory
{
    public abstract Keyboard CreateKeyboard();
    public abstract Mouse CreateMouse();
    public abstract Monitor CreateMonitor();
}

public class DellFactory : Factory
{
    public override Keyboard CreateKeyboard()
    {
        return new DellKeyboard();
    }

    public override Monitor CreateMonitor()
    {
        return new DellMonitor();
    }

    public override Mouse CreateMouse()
    {
        return new DellMouse();
    }
}

public class HPFactory : Factory
{
    public override Keyboard CreateKeyboard()
    {
        return new HPKeyboard();
    }

    public override Monitor CreateMonitor()
    {
        return new HPMonitor();
    }

    public override Mouse CreateMouse()
    {
        return new HPMouse();
    }
}

使用

// 抽象工厂模式
Console.WriteLine("----------------------- 抽象工厂模式 ----------------------------");
new DellFactory().CreateKeyboard().Create();    // 生产戴尔键盘
new DellFactory().CreateMonitor().Create();     // 生产戴尔显示器
new DellFactory().CreateMouse().Create();       // 生产戴尔鼠标

new HPFactory().CreateKeyboard().Create();      // 生产惠普键盘
new HPFactory().CreateMonitor().Create();      // 生产惠普显示器
new HPFactory().CreateMouse().Create();      // 生产惠普鼠标

4.抽象工厂模式优缺点

  • 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

网站公告

今日签到

点亮在社区的每一天
去签到