#include <iostream>
#include <QString>
// 产品接口
class IWidget {
public:
virtual QString style() = 0;
};
// 具体产品:Button
class Button : public IWidget {
public:
QString style() {
return "Button Style";
}
};
// 具体产品:TextBox
class TextBox : public IWidget {
public:
QString style() {
return "TextBox Style";
}
};
// 工厂接口
class WidgetFactory {
public:
virtual IWidget* createWidget() = 0;
};
// Button工厂
class ButtonFactory : public WidgetFactory {
public:
IWidget* createWidget() {
return new Button();
}
};
// TextBox工厂
class TextBoxFactory : public WidgetFactory {
public:
IWidget* createWidget() {
return new TextBox();
}
};
int main() {
// 使用Button工厂
WidgetFactory* factory = new ButtonFactory();
IWidget* widget = factory->createWidget();
std::cout << "Widget style: " << widget->style().toStdString() << std::endl;
// 清理资源
delete widget;
delete factory;
// 使用TextBox工厂
factory = new TextBoxFactory();
widget = factory->createWidget();
std::cout << "Widget style: " << widget->style().toStdString() << std::endl;
// 清理资源
delete widget;
delete factory;
return 0;
}
区别:
普通工厂模式(Factory Method Pattern)设计的初衷是解耦产品的创建和使用。在这种模式中,每个工厂类通常只负责创建一种具体的产品。这样做的主要原因有:
-
单一职责原则:按照面向对象设计原则,每个类应该只有一个改变的理由。如果一个工厂类能创建多种类型的产品,那么它就有多个改变的理由(例如,如果需要添加或修改一种产品,就可能需要修改这个工厂类)。将每种产品的创建逻辑放在各自的工厂类中,可以使每个工厂只关注一种产品的创建,符合单一职责原则。
-
灵活性和可扩展性:当系统需要引入新的产品类型时,只需新增一个具体的工厂类而无需修改现有代码。这样做增强了系统的灵活性和可扩展性,同时也降低了引入新产品时的错误风险。
-
解耦:工厂模式使得产品的使用者不需要知道产品的具体类。这种解耦使得更改或扩展产品类变得更容易,因为产品的使用者不会受到影响。
-
维护性:如果一个工厂类负责创建多种产品,随着产品种类的增加,这个类可能会变得非常复杂,难以维护和理解。单一工厂为单一产品的原则使得每个工厂和产品的维护都变得相对简单。
确实,普通工厂模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)在表面上看起来很相似,但它们解决的问题和应用场景有所不同。下面我将详细解释两者之间的主要区别:
-
设计目的不同:
- 普通工厂模式的主要目的是对产品类的实例化进行封装,它允许子类决定实例化哪一个具体产品类。这种模式主要用于创建一个产品类的多个实例。
- 抽象工厂模式则是提供一个接口,用于创建一系列相关或相互依赖的对象,而不指定具体类。这种模式通常用于创建复杂对象,这些对象一般有多个构成部分,每个部分可能有多个实现变体。
-
产品的复杂性:
- 普通工厂模式通常用于创建单一产品,这些产品不太复杂,或者产品之间没有显著的关联。
- 抽象工厂模式适用于创建复杂的产品族,其中每个产品族可能由多个部分组成,而且产品间有一定的关联。
-
产品的多样性和关联性:
- 在普通工厂模式中,每个工厂通常只创建一种类型的产品。
- 在抽象工厂模式中,一个工厂可以创建多个相关联的产品,这些产品通常设计为一起使用。
-
扩展性:
- 普通工厂模式在添加新的产品时,需要修改工厂接口,这可能会影响到现有的工厂类。
- 抽象工厂模式在添加新的产品族时,可以通过添加新的工厂类来实现,不需要修改现有的工厂接口,从而保持了较好的开闭原则(Open-Closed Principle)。
-
实现的复杂性:
- 普通工厂模式的实现通常比较简单,易于理解和使用。
- 抽象工厂模式由于能够创建多种类型的产品,实现起来可能更复杂。
在实际应用中,选择哪种模式取决于你的具体需求。如果你的应用程序中产品较为简单,且不需要考虑多个相关产品的创建,则普通工厂模式可能更合适。如果你需要处理一组相关或相互依赖的产品,抽象工厂模式可能是更好的选择。