一、什么是简单工厂模式?
简单工厂模式是一种创建型设计模式,这个模式实现了工厂设计模式的最基本形态,通过一个工厂类决定创建出哪一种产品类的实例。
简单工厂模式由以下几个核心角色组成:
- 工厂类(Factory):负责创建具体对象的工厂类。它通常包含一个静态方法,根据客户端的请求参数决定创建哪个具体对象,并返回创建的对象。
- 抽象产品类(Product):定义了产品的共同接口,描述了产品所具有的功能和行为。
- 具体产品类(Concrete Product):实现了抽象产品类定义的接口,具体产品类是工厂类所创建的对象。
简单工厂模式将对象的实例化操作封装在工厂类中,客户端只需通过工厂类来请求所需的对象,而无需关心对象的具体创建过程。
二、代码举例
假设有一个工厂要绘制各种图形,首先有一个形状类
class Shape {
public:
virtual void draw() = 0;
};
然后定义各种具体的形状类
// 定义矩形类
class Rectangle : public Shape {
public:
void draw() override {
cout << "Draw rectangle" << endl;
}
};
// 定义圆类
class Circle : public Shape {
public:
void draw() override {
cout << "Draw circle" << endl;
}
};
接着定义工厂类,他包含静态的创建函数
class ShapeFactory {
public:
static Shape* getShape(string type) {
if (type == "rectangle") {
return new Rectangle();
}
else if (type == "circle") {
return new Circle();
}
return nullptr;
}
};
最后是客户端调用的代码
// 绘制圆形
Shape* shape1 = ShapeFactory::getShape("circle");
shape1->draw();
// 绘制矩形
Shape* shape2 = ShapeFactory::getShape("rectangle");
shape2->draw();
有朋友肯定要问了,为什么这个工厂类的函数一定要创建成静态的呢,我主打一个叛逆,就不创建成静态的可以吗?
也不是不行,只是创建成静态的有以下几个优点:
1.不需要创建工厂类的实例
静态函数通过类名调用:
MyClass::func();
普通成员函数需要通过对象调用:
MyClass obj;
obj.func();
简单工厂模式中,工厂类仅用来封装创建对象的逻辑,不需要维护任何状态,所以不需要创建这个类的实例,直接用类名调用静态方法更简单。
2.避免产生工厂类依赖
如果使用普通成员函数,需要先创建工厂类对象,然后调用方法,这样客户端代码就依赖了这个具体的工厂类。使用静态函数可以避免这个依赖。
3.符合简单工厂模式的特点
简单工厂模式更加关注创建对象的方法,而不是工厂类本身,所以使用静态方法创建对象更符合这种设计思想。
三、总结
当对象种类较少,客户端无需明确指定创建对象时,可以使用简单工厂模式。但扩展性较差,不能符合开闭原则。