设计模式-工厂模式
1.简单工厂模式
- 简单工厂模式是工厂模式中最简单的一种
- 客户端只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但是客户端看到的只是产品的抽象对象,并不需要关心到底是返回了哪个子类。
- 客户端唯一需要知道的具体子类就是工厂子类
- 缺点:要增加新的核类型时,就需要修改工厂类,这样就违反类开放封闭原则(软件实体(类、模块、函数)可以扩展,但是不可以修改)
- 示例代码
// enum CTYPE{ // COREA,COREB // }; class SingleCore{ public: virtual void Show() = 0; }; class SingleCoreA:public SingleCore{ public: void Show(){ cout << "SingleCore A"<<endl; } }; class SingleCoreB:public SingleCore{ public: void Show(){ cout << "SingleCore B"<<endl; } }; class Factory{ public: SingleCore* CreateSingleCore(enum CTYPE ctype){ switch (ctype){ case COREA: return new SingleCoreA(); case COREB: return new SingleCoreB(); default: return nullptr; } } };
2.工厂方法模式
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类。
- 缺点:每增加一种产品,就需要增加一个对象的工厂
- 适用场景:适用于大部分地方都只使用其中一种产品,工厂类也不用频繁创建产品类的情况,这样修改的时候只需要修改有限的几个地方即可。
class SingleCore { public: virtual void Show() = 0; }; class SingleCoreA : public SingleCore { public: void Show() { cout << "SingleCore A" << endl; } }; class SingleCoreB : public SingleCore { public: void Show() { cout << "SingleCore B" << endl; } }; class Factory { public: virtual SingleCore *CreateSingleCore() = 0; }; class FactoryA : public Factory { public: SingleCoreA *CreateSingleCore() { return new SingleCoreA(); } }; class FactoryB : public Factory { SingleCoreB *CreateSingleCore() { return new SingleCoreB(); } };
3.抽象工厂模式
- 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 缺点:代码过于臃肿;每次如果添加一组茶品,那么所有的工厂类就必须添加一个方法,这样违背了开放-封闭原则,所以一般适用于产品组合产品族变化不大的情况。
class SingleCore {
public:
virtual void Show() = 0;
};
class SingleCoreA : public SingleCore {
public:
void Show() {
cout << "SingleCore A" << endl;
}
};
class SingleCoreB : public SingleCore {
public:
void Show() {
cout << "SingleCore B" << endl;
}
};
class MultiCore {
public:
virtual void Show() = 0;
};
class MultiCoreA : public MultiCore {
public:
void Show() {
cout << "Multi Core A" << endl;
}
};
class MultiCoreB : public MultiCore {
public:
void Show() {
cout << "Multi Core B" << endl;
}
};
class CoreFactory {
public:
virtual SingleCore *CreateSingleCore() = 0;
virtual MultiCore *CreateMultiCore() = 0;
};
class FactoryA : public CoreFactory {
public:
SingleCore *CreateSingleCore() {
return new SingleCoreA();
}
MultiCore *CreateMultiCore() {
return new MultiCoreA();
}
};
class FactoryB : public CoreFactory {
public:
SingleCore *CreateSingleCore() {
return new SingleCoreB();
}
MultiCore *CreatingMultiCore() {
return new MultiCoreB();
}
};