抽象工厂模式

简介: 抽象工厂模式是一种创建型设计模式,提供接口用于创建一系列相关或依赖的对象,无需指定具体类。适用于产品族的创建,确保兼容性和一致性。优点包括分离接口与实现、产品族一致性、遵循开闭原则;缺点是扩展产品种类困难、增加系统复杂性。常见应用场景包括跨平台 UI、数据库访问、游戏开发和主题风格切换。

抽象工厂模式详解

定义

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。

抽象工厂模式特别适合产品族的创建,保证产品的兼容性和一致性。


抽象工厂模式的特点

优点

  1. 分离接口与实现:客户端仅依赖抽象接口,与具体实现解耦。
  2. 产品族一致性:确保同一工厂创建的对象是兼容的,避免出现不匹配的情况。
  3. 遵循开闭原则:添加新产品族时,只需新增具体工厂类,无需修改已有代码。

缺点

  1. 扩展产品种类困难:新增产品种类时,需要修改抽象工厂接口及所有子类。
  2. 增加系统复杂性:引入额外的抽象层,使系统的类结构更加复杂。

适用场景

  1. 跨平台应用开发
    通过抽象工厂为不同操作系统(Windows、Mac、Linux)创建平台相关的 UI 控件。
  2. 数据库访问
    支持不同数据库(MySQL、Oracle、SQL Server)的数据访问逻辑。
  3. 游戏开发
    在游戏中为不同种族或阵营创建一系列相关的角色和武器。
  4. 主题风格切换
    应用支持切换不同主题,每个主题有一组对应的按钮、窗口样式。

抽象工厂模式的结构

核心角色

  1. 抽象工厂(Abstract Factory):定义创建一系列相关或相互依赖对象的接口。
  2. 具体工厂(Concrete Factory):实现抽象工厂接口,创建特定产品族的对象。
  3. 抽象产品(Abstract Product):为每种产品定义一个接口。
  4. 具体产品(Concrete Product):实现抽象产品接口,由具体工厂创建。

使用案例

案例 1:跨平台 UI

根据操作系统不同,创建适配的按钮和窗口。

案例 2:数据库访问

创建针对不同数据库的连接对象和查询对象。

案例 3:游戏装备

为不同阵营创建特定类型的武器、护甲等装备。


抽象工厂模式的实现

C++ 实现

#include <iostream>
#include <memory>

// 抽象产品 A
class Button {
public:
   virtual void click() = 0;
   virtual ~Button() = default;
};

// 抽象产品 B
class Window {
public:
   virtual void render() = 0;
   virtual ~Window() = default;
};

// 具体产品 A1
class WindowsButton : public Button {
public:
   void click() override {
       std::cout << "Windows Button Clicked!" << std::endl;
   }
};

// 具体产品 A2
class MacButton : public Button {
public:
   void click() override {
       std::cout << "Mac Button Clicked!" << std::endl;
   }
};

// 具体产品 B1
class WindowsWindow : public Window {
public:
   void render() override {
       std::cout << "Rendering Windows Window!" << std::endl;
   }
};

// 具体产品 B2
class MacWindow : public Window {
public:
   void render() override {
       std::cout << "Rendering Mac Window!" << std::endl;
   }
};

// 抽象工厂
class GUIFactory {
public:
   virtual std::unique_ptr<Button> createButton() = 0;
   virtual std::unique_ptr<Window> createWindow() = 0;
   virtual ~GUIFactory() = default;
};

// 具体工厂 1
class WindowsFactory : public GUIFactory {
public:
   std::unique_ptr<Button> createButton() override {
       return std::make_unique<WindowsButton>();
   }
   std::unique_ptr<Window> createWindow() override {
       return std::make_unique<WindowsWindow>();
   }
};

// 具体工厂 2
class MacFactory : public GUIFactory {
public:
   std::unique_ptr<Button> createButton() override {
       return std::make_unique<MacButton>();
   }
   std::unique_ptr<Window> createWindow() override {
       return std::make_unique<MacWindow>();
   }
};

// 客户端代码
int main() {
   std::unique_ptr<GUIFactory> factory = std::make_unique<WindowsFactory>();
   auto button = factory->createButton();
   auto window = factory->createWindow();

   button->click();
   window->render();

   factory = std::make_unique<MacFactory>();
   button = factory->createButton();
   window = factory->createWindow();

   button->click();
   window->render();

   return 0;
}


C# 实现

using System;

// 抽象产品 A
public abstract class Button {
   public abstract void Click();
}

// 抽象产品 B
public abstract class Window {
   public abstract void Render();
}

// 具体产品 A1
public class WindowsButton : Button {
   public override void Click() {
       Console.WriteLine("Windows Button Clicked!");
   }
}

// 具体产品 A2
public class MacButton : Button {
   public override void Click() {
       Console.WriteLine("Mac Button Clicked!");
   }
}

// 具体产品 B1
public class WindowsWindow : Window {
   public override void Render() {
       Console.WriteLine("Rendering Windows Window!");
   }
}

// 具体产品 B2
public class MacWindow : Window {
   public override void Render() {
       Console.WriteLine("Rendering Mac Window!");
   }
}

// 抽象工厂
public abstract class GUIFactory {
   public abstract Button CreateButton();
   public abstract Window CreateWindow();
}

// 具体工厂 1
public class WindowsFactory : GUIFactory {
   public override Button CreateButton() {
       return new WindowsButton();
   }

   public override Window CreateWindow() {
       return new WindowsWindow();
   }
}

// 具体工厂 2
public class MacFactory : GUIFactory {
   public override Button CreateButton() {
       return new MacButton();
   }

   public override Window CreateWindow() {
       return new MacWindow();
   }
}

// 客户端代码
class Program {
   static void Main(string[] args) {
       GUIFactory factory = new WindowsFactory();
       Button button = factory.CreateButton();
       Window window = factory.CreateWindow();

       button.Click();
       window.Render();

       factory = new MacFactory();
       button = factory.CreateButton();
       window = factory.CreateWindow();

       button.Click();
       window.Render();
   }
}


抽象工厂模式的类图

扩展与对比

1. 抽象工厂 vs 工厂方法

特性 工厂方法模式 抽象工厂模式
关注点 单一产品的创建 产品族的创建
扩展性 添加新产品需新增具体工厂类 添加新产品族需新增抽象工厂及实现
复杂度 较低 较高

2. 抽象工厂扩展

  • 结合单例模式:避免频繁创建工厂实例。
  • 结合建造者模式:处理复杂产品的构建细节。

总结

抽象工厂模式非常适合产品族场景,能很好地保证产品间的兼容性。但在产品种类频繁变化的情况下,其扩展性受到限制。通过结合其他模式(如单例、建造者),可以进一步提升其灵活性和实用性。

目录
相关文章
|
8月前
创建型 抽象工厂模式
创建型 抽象工厂模式
43 1
|
3月前
|
设计模式 C#
C# 一分钟浅谈:工厂模式与抽象工厂模式
【10月更文挑战第10天】本文介绍了面向对象编程中的两种常见创建型设计模式:工厂模式和抽象工厂模式。工厂模式通过共同接口创建对象,隐藏创建逻辑,提高封装性和扩展性;抽象工厂模式则提供了一系列相关对象的创建接口,适用于多个相关产品族的创建。文章通过C#代码示例详细解释了这两种模式的实现和应用场景,并讨论了它们的优点、缺点及常见问题。
69 19
|
5月前
|
设计模式 uml
工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结
工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结
|
8月前
|
设计模式
工厂模式与抽象工厂模式
​ 如有错误或有补充,以及任何的改进意见,请在评论区留下您的高见 工厂模式 工厂模式是一种创建型设计模式。在工厂模式中,类的实例化过程通常是通过一个专门的工厂类来完成的,而不是直接在客户端代码中进行的。这样可以提供更好的封装,使得客户端代码与具体产品的实现解耦,增加代码的灵活性和可维护性。 优点 封装性:客户端代码不再需要知道所创建对象的详细信息,只需要与工厂接口进行交互即可。 灵活性:工厂模式使得系统更加灵活,可以在不修改客户端代码的情况下更换或添加新产品。 可扩展性:通过使用工厂模式,当需要添加新产品时,只需要扩展工厂类,而不需要修改客户端代码。 基本结构 抽象产品(Abstra
62 0
|
设计模式
2023-6-11-第二式抽象工厂模式
2023-6-11-第二式抽象工厂模式
81 0
|
设计模式 C++
2023-6-10-第一式工厂方法模式
2023-6-10-第一式工厂方法模式
92 0
|
设计模式
工厂方法模式详细介绍
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种将对象的创建逻辑封装在工厂类中的方式,使得客户端代码无需直接依赖具体的类来创建对象。
112 0
|
设计模式 关系型数据库 程序员
简单工厂模式、工厂模式、抽象工厂模式
简单工厂模式、工厂模式、抽象工厂模式
146 2
简单工厂模式、工厂模式、抽象工厂模式
|
XML 设计模式 JSON
创建型:抽象工厂模式
创建型:抽象工厂模式
119 0

热门文章

最新文章

下一篇
开通oss服务