概述
工厂方法模式(Factory Method Pattern)是一种常用的创建型设计模式。它通过定义一个创建对象的接口,但是将具体的实例化工作延迟到子类中去完成。这种方式可以使得一个类的实例化延迟到其子类。
设计原理
工厂方法模式主要包含以下几个角色:
- 抽象产品(Product):定义了产品的抽象接口,可以是一个接口或者抽象类。
- 具体产品(Concrete Product):实现了抽象产品接口的具体类。
- 抽象工厂(Creator):定义了一个创建产品对象的抽象方法,返回一个抽象产品类型的对象。
- 具体工厂(Concrete Creator):实现了抽象工厂中的抽象方法,返回一个具体产品类型的对象。
优缺点
1、优点
- 松耦合:客户端代码只需要知道抽象工厂和抽象产品,不需要关心具体的实现类,从而减少了对象之间的耦合度。
- 可扩展性:添加新的产品类只需要扩展具体产品和具体工厂,而不需要修改客户端代码。
- 符合开闭原则:对扩展开放,对修改关闭。
2、缺点
- 类的数量增加:使用工厂方法模式会增加代码的数量,因为需要为每个产品类都创建一个对应的工厂类。
- 增加了复杂度:当产品类较多时,工厂类的数量也会增加,增加了系统的复杂度。
应用示例
假设我们有一个简单的图形库,需要创建不同类型的图形对象,比如圆形和矩形。我们可以使用工厂方法模式来实现。
首先,我们定义抽象产品类 Shape:
class Shape {
public:
virtual void draw() = 0;
virtual ~Shape() {}
};
然后,我们定义具体产品类 Circle 和 Rectangle:
class Circle : public Shape {
public:
void draw() override {
std::cout << "Drawing Circle\n";
}
};
class Rectangle : public Shape {
public:
void draw() override {
std::cout << "Drawing Rectangle\n";
}
};
接着,我们定义抽象工厂类 ShapeFactory:
class ShapeFactory {
public:
virtual Shape* createShape() = 0;
virtual ~ShapeFactory() {}
};
最后,我们定义具体工厂类 CircleFactory 和 RectangleFactory:
class CircleFactory : public ShapeFactory {
public:
Shape* createShape() override {
return new Circle();
}
};
class RectangleFactory : public ShapeFactory {
public:
Shape* createShape() override {
return new Rectangle();
}
};
现在我们可以使用工厂方法来创建图形对象:
int main() {
ShapeFactory* circleFactory = new CircleFactory();
Shape* circle = circleFactory->createShape();
circle->draw();
ShapeFactory* rectangleFactory = new RectangleFactory();
Shape* rectangle = rectangleFactory->createShape();
rectangle->draw();
delete circle;
delete circleFactory;
delete rectangle;
delete rectangleFactory;
return 0;
}
与抽象工厂模式对比
工厂方法模式:关注的是一个产品等级结构,即每个工厂只负责创建一个具体产品,但是可能有多个不同类型的具体工厂。适用于一个产品等级结构,但是可能有多个不同类型的具体工厂,且新增产品时对已有代码影响较小的情况
抽象工厂模式:关注的是多个产品等级结构,即每个工厂可以创建一组相关的产品,且通常一个抽象工厂对应一个产品族,而不是单一的产品。适用于多个产品等级结构,且每个等级结构有多个产品组成,同时需要保证产品之间的兼容性,例如 GUI 工具包的开发中,不同操作系统下的按钮、文本框等。