定义
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
模式中包含的角色及其职责
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
简单工厂模式所创建的具体实例对象
在本案例中,通过通过调用ConfFactory
的createConfObj()
方法,实现在不同的地方加载配置文件
类图
程序
抽象产品类
class ConfAbstract {
public:
virtual void getConf() = 0;
};
具体实现类
class etcdConf : public ConfAbstract {
public:
virtual void getConf() {
cout << "从etcd中加载配置文件" << endl;
}
};
class fileConf : public ConfAbstract {
public:
virtual void getConf() {
cout << "从本地文件中加载配置文件" << endl;
}
};
简单工厂类
class ConfFactory {
public:
ConfAbstract *createConfObj(char *str) {
if (strcmp(str, "etcd") == 0) {
return new etcdConf;
} else if (strcmp(str, "file") == 0) {
return new fileConf;
} else {
printf("记录日志,或者接抛出错误\n");
return nullptr;
}
}
};
调用
通过调用简单工厂类ConfFactory
的createConfObj()
方法创建对象,传入不同的参数,返回不同的对象指针。
在整个过程冲需要注意两点:
- 对象的申请与释放
- 通过工厂返回对象时需要进行错误处理
// 1. 申请工厂类
ConfFactory *pFac = new ConfFactory();
// 2. 创建通过抽象抽象产品类创建具体实现指针变量
ConfAbstract *etcdConf = nullptr; // 抽象父类ConfAbstract指向子类etcdConf
// 3.具体产品指针变量和对象
etcdConf = pFac->createConfObj("etcd");
if (nullptr == etcdConf ) {
// 传入的参数可能存在错误,所以需要进行错误处理
}
// 4. 调用产品的方法
etcdConf->getConf(); // 调用虚函数
// 5.释放具体产品内存
if (nullptr != etcdConf) {
delete etcdConf;
etcdConf = nullptr;
}
// 另一个类的实现
ConfAbstract *fileConf = nullptr;
fileConf = pFac->createConfObj("file");
fileConf->getConf(); // 调用虚函数
if (nullptr != fileConf) {
delete fileConf;
fileConf = nullptr;
}
// 6.释放工厂类
if (nullptr != pFac) {
delete pFac;
pFac = nullptr;
}