设计模式-工厂模式
来源:互联网 发布:淘宝steam国区礼物 编辑:程序博客网 时间:2024/06/05 04:15
工厂模式主要有简单工厂模式、工厂方法模式和抽象工厂模式
简单个工厂模式:
比如要创建一个计算器实现加减乘除,就可以建立各种运算类,在通过一个工厂返回某个运算类的实例。
UML:
//抽象运算类class Operation { public: virtual double GetResult(double A, double B) { return 0; }};//加法类class OperationAdd :public Operation {public: double GetResult(double A,double B) { return A + B; }};//减法类class OperationSub :public Operation {public: double GetResult(double A, double B) { return A - B; }};//乘法类class OperationMul :public Operation {public: double GetResult(double A, double B) { return A * B; }};//除法类class OperationDiv :public Operation {public: double GetResult(double A, double B) { if (B != 0) return A / B; else cout << "Error"; }};enum TYPE { Add=0, Sub, Mul, Div };//简单工厂类class Factory {public: static Operation *CreateOperation(TYPE type) { Operation* oper = NULL; switch (type) { case Add: oper = new OperationAdd(); break; case Sub: oper = new OperationSub(); break; case Mul: oper = new OperationMul(); break; case Div: oper = new OperationDiv(); break; } return oper; }};int main(){ Operation *oper = Factory::CreateOperation(Add); cout<<oper->GetResult(2,3); system("pause"); return 0;}
简单工厂模式在增加新的类型时,需要修改工厂类,违背了开放封闭原则。所以就出现了工厂方法模式。
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单来说就是每一个运算类通过各自的子工厂返回其实例,客户端直接使用子工厂。
UML:
前面部分一样,后面修改为
//抽象工厂类class Factory {public: virtual Operation *CreateOperation() = 0;};//加法工厂class FactoryAdd :public Factory{public: OperationAdd *CreateOperation() { return new OperationAdd(); }};int main(){ Factory *Add = new FactoryAdd(); Operation *oper = Add->CreateOperation(); cout<<oper->GetResult(2,3); system("pause"); return 0;}
抽象工厂模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
假设一家公司不仅可以生产单核处理器,也能生产多核处理器。这家公司开设两个工厂,一个专门用来生产A型号的单核多核处理器,而另一个工厂专门用来生产B型号的单核多核处理器。
UML:
//单核 class SingleCore{public: virtual void Show() = 0;};class SingleCoreA : public SingleCore{public: void Show() { cout << "Single Core A" << endl; }};class SingleCoreB :public SingleCore{public: void Show() { cout << "Single Core 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;};//工厂A,专门用来生产A型号的处理器 class FactoryA :public CoreFactory{public: SingleCore* CreateSingleCore() { return new SingleCoreA(); } MultiCore* CreateMultiCore() { return new MultiCoreA(); }};//工厂B,专门用来生产B型号的处理器 class FactoryB : public CoreFactory{public: SingleCore* CreateSingleCore() { return new SingleCoreB(); } MultiCore* CreateMultiCore() { return new MultiCoreB(); }};int main(){ FactoryA *A = new FactoryA(); A->CreateSingleCore()->Show(); FactoryB *B = new FactoryB(); B->CreateMultiCore()->Show(); system("pause"); return 0;}
1 0
- 设计模式------工厂模式
- 设计模式------工厂模式
- 设计模式 [ 工厂模式 ]
- 设计模式--工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 工厂模式
- 设计模式-工厂模式
- 设计模式 -- 工厂模式
- 设计模式-工厂模式
- 设计模式----工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式---工厂模式
- 设计模式-工厂模式
- 设计模式--工厂模式
- 设计模式 - 工厂模式
- 自定义控件_绘制太极(拖动)
- Latex中点乘、叉乘、除以
- SpringMVC_文件上传
- 线程池的使用与底层实现机制
- 读《文明之光》吴军
- 设计模式-工厂模式
- 胶水命令
- 自定义View
- Linux内存管理之mmap详解
- ZigBee 3.0 《Base-Device-Behavior-Specification》--Commissioning
- linux下如何实现mysql数据库每天自动备份定时备份
- 让你自己写的Android的Launcher成为系统中第一个启动的,也是唯一的Launcher
- js检测类型
- 微信小程序--域名配置