C++结构型设计模式之使用抽象工厂来创建和配置桥接模式的例子
下面是一个使用抽象工厂模式来创建和配置桥接模式的示例,场景是创建不同操作系统的窗口(Window)及其对应的实现(WindowImpl)。我们将通过抽象工厂来创建不同操作系统下的窗口和实现。
代码示例
#include <iostream>
// 抽象产品:窗口接口
class Window {
public:
virtual void draw() = 0;
virtual void resize() = 0;
};
// 抽象产品:窗口实现接口
class WindowImpl {
public:
virtual void drawImpl() = 0;
virtual void resizeImpl() = 0;
};
// 具体产品:Windows窗口
class WindowsWindow : public Window {
private:
WindowImpl* impl;
public:
WindowsWindow(WindowImpl* impl) : impl(impl) {}
void draw() override {
std::cout << "Drawing Windows Window" << std::endl;
impl->drawImpl();
}
void resize() override {
std::cout << "Resizing Windows Window" << std::endl;
impl->resizeImpl();
}
};
// 具体产品:Linux窗口
class LinuxWindow : public Window {
private:
WindowImpl* impl;
public:
LinuxWindow(WindowImpl* impl) : impl(impl) {}
void draw() override {
std::cout << "Drawing Linux Window" << std::endl;
impl->drawImpl();
}
void resize() override {
std::cout << "Resizing Linux Window" << std::endl;
impl->resizeImpl();
}
};
// 具体产品:Windows窗口实现
class WindowsWindowImpl : public WindowImpl {
public:
void drawImpl() override {
std::cout << "Drawing Windows Impl" << std::endl;
}
void resizeImpl() override {
std::cout << "Resizing Windows Impl" << std::endl;
}
};
// 具体产品:Linux窗口实现
class LinuxWindowImpl : public WindowImpl {
public:
void drawImpl() override {
std::cout << "Drawing Linux Impl" << std::endl;
}
void resizeImpl() override {
std::cout << "Resizing Linux Impl" << std::endl;
}
};
// 抽象工厂:窗口工厂接口
class WindowFactory {
public:
virtual Window* createWindow() = 0;
virtual WindowImpl* createWindowImpl() = 0;
};
// 具体工厂:Windows窗口工厂
class WindowsWindowFactory : public WindowFactory {
public:
Window* createWindow() override {
return new WindowsWindow(createWindowImpl());
}
WindowImpl* createWindowImpl() override {
return new WindowsWindowImpl();
}
};
// 具体工厂:Linux窗口工厂
class LinuxWindowFactory : public WindowFactory {
public:
Window* createWindow() override {
return new LinuxWindow(createWindowImpl());
}
WindowImpl* createWindowImpl() override {
return new LinuxWindowImpl();
}
};
int main() {
// 创建Windows窗口工厂
WindowFactory* windowsFactory = new WindowsWindowFactory();
// 使用Windows工厂创建窗口
Window* windowsWindow = windowsFactory->createWindow();
windowsWindow->draw();
windowsWindow->resize();
// 创建Linux窗口工厂
WindowFactory* linuxFactory = new LinuxWindowFactory();
// 使用Linux工厂创建窗口
Window* linuxWindow = linuxFactory->createWindow();
linuxWindow->draw();
linuxWindow->resize();
// 清理资源
delete windowsFactory;
delete windowsWindow;
delete linuxFactory;
delete linuxWindow;
return 0;
}
代码说明
- Window:窗口接口,定义了
draw
和resize
方法。 - WindowImpl:窗口实现接口,定义了
drawImpl
和resizeImpl
方法。 - WindowsWindow 和 LinuxWindow:具体的窗口类,分别实现Windows和Linux系统的窗口。
- WindowsWindowImpl 和 LinuxWindowImpl:具体的窗口实现类,分别实现Windows和Linux系统的窗口实现。
- WindowFactory:抽象工厂接口,定义了
createWindow
和createWindowImpl
方法。 - WindowsWindowFactory 和 LinuxWindowFactory:具体的工厂类,分别创建Windows和Linux系统的窗口及其对应的实现。
- main 函数:演示如何使用抽象工厂来创建和配置不同操作系统下的窗口。
通过这种方式,我们可以在不同的操作系统下创建和配置相应的窗口和实现,而不需要为每种操作系统创建大量的子类。