简单工厂模式
简单工厂模式并不属于GoF的23种设计模式。
例子:
假如存在一个水果类Fruit:该类有一个带参数的构造函数,用来初始化水果名称;还有一个获取水果名称的成员函数。
Fruit(string name) {
this->name = name;
if (name == "apple") {
//代表苹果
}
else if (name == "banana") {
//2 代表⾹蕉
}
else if (name == "pear") {
//3 代表鸭梨
}
}
void getName() {
if (name == "apple") {
cout << "我是苹果" << endl;
}
else if (name == "banana") {
cout << "我是⾹蕉" << endl;
}
else if (name == "pear") {
cout << "我是鸭梨" << endl;
}
}
不难看出,该类包含了大量的条件语句;并且Fruit类的职责太重,负责初始化和显示所有的水果对象,将各种水果对象的初始化代码和显示代码集中在一个类中实现,违反了“单一职责原则”,不利于类的重用和维护;当需要增加新类型的水果时,必须修改Fruit类的源代码,违反了“开闭原则”。
模式中的角色和职责
工厂(Factory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑、工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品(AbstractProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(ConcreteProduct)角色:简单工厂模式所创建的具体实例对象。
示例
#include <iostream>
#include <cstdlib>
using namespace std;
//抽象产品
class AbstractFruit {
public:
virtual void showFruitName() = 0;
};
//具体产品
class Apple :public AbstractFruit {
public:
virtual void showFruitName() {
cout << "Apple" << endl;
}
};
//具体产品
class Orange : public AbstractFruit {
public:
virtual void showFruitName() {
cout << "orange" << endl;
}
};
//工厂
class FruitFactory{
public:
static AbstractFruit * CreateFruit(string flag) {
if (flag == "Apple") {
return new Apple;
}
else if (flag == "Orange") {
return new Orange;
}
else {
return NULL;
}
}
};
void test() {
FruitFactory *factory = new FruitFactory;
AbstractFruit *fruit = factory->CreateFruit("Apple");
fruit->showFruitName();
delete fruit;
fruit = NULL;
fruit = factory->CreateFruit("Orange");
fruit->showFruitName();
delete fruit;
fruit = NULL;
delete factory;
}
int main(int argc, char **argv)
{
/*用工厂创建一个具体的水果类,返回抽象类指针,反生多态。此时抽象类指针指向了具体的子类
调用抽象方法,就会调用子类的实现方法*/
test();
return 0;
}
简单工厂模式的优缺点
优点:
实现了对象创建和使用的分离;
不需要记住具体类名,记住参数即可,减少使用者记忆量。
缺点:
对工厂类职责过重,一旦不能工作,系统将会受到影响;
增加系统中类的个数,复杂度和理解度增加;
违反“开闭原则”,添加新产品时需要修改工厂逻辑,工厂越来越复杂。
适用场景
工厂类负责创建的对象较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂;
客户端只知道传入工厂类的参数,对如何创建对象并不关心。