设计模式之工厂模式
来源:互联网 发布:网络作家收入100排行榜 编辑:程序博客网 时间:2024/06/06 01:11
设计模式之工厂模式
编程本质上是现实世界的抽象实现,所以编程也有一定的套路在,为了方便我们的工作学习,我们需要不断积累这种套路,所幸已经有许多巨人总结了许多“套路”,那么再该系列,我将介绍这些“程序设计模式”,并用C++加以实现,介绍过程中也会加入我的个人想法,欢迎大家批评指正。
- 简单工厂模式
- 工厂模式
- 抽象工厂模式
目录
- 设计模式之工厂模式
- 目录
- 快捷键
- 简单工厂模式
- 代码实现
- 工厂模式
- 抽象工厂模式
快捷键
- 加粗
Ctrl + B
- 斜体
Ctrl + I
- 引用
Ctrl + Q
- 插入链接
Ctrl + L
- 插入代码
Ctrl + K
- 插入图片
Ctrl + G
- 提升标题
Ctrl + H
- 有序列表
Ctrl + O
- 无序列表
Ctrl + U
- 横线
Ctrl + R
- 撤销
Ctrl + Z
- 重做
Ctrl + Y
1 简单工厂模式
简单工厂模式是指由工厂对象决定实例化哪一个产品类。
优点:只需要告诉工厂型号,不需要记住产品具体名称;
缺点:新增产品时,需要修改工厂类。(违反开放-封闭原则)
代码实现
步骤如下:
1)首先,定义一个抽象类shape,其中定义了纯虚函数start();
2)然后,通过继承定义了“实体”类(具体产品)circle和shape;
3)接着,定义一个工厂类,实现了shape* factory::creat(int type),该函数根据输入确定要实例化哪一个子类(产品即circle和shape),将其返回给基类对象;
4)最后,在代码中只要实例化一个工厂类,根据需要动态选择具体产品。
#include <iostream>using namespace std;class shape{ public: virtual void start() = 0;};class circle : public shape{ public: void start(){ cout << "circle" << endl; }};class rectange : public shape{ public: void start(){ cout << "rectange" << endl; }};class factory{ public: shape* creat(int type) { shape* temp = NULL; switch(type){ case 1: temp = new circle(); break; case 2: temp = new rectange(); break; default: temp = new circle(); break; } return temp; }};int main(){ factory* fac = new factory(); shape* shape1 = fac->creat(2); shape1->start(); return 0;}
2 工厂模式
工厂模式是对简单工厂模式的优化,即在增加产品时不需要修改工厂类。
优点:增加产品时不需要修改工厂类。
缺点:一个工厂只能生产一种产品,因此可以考虑再加一层抽象(即一个工厂只生成一类产品,具体什么产品可以由子类决定)。
#include <iostream>using namespace std;class shape{ public: virtual void start() = 0;};class circle : public shape{ public: void start(){ cout << "circle" << endl; }};class rectange : public shape{ public: void start(){ cout << "rectange" << endl; }};class factory{ public: virtual shape* creat() = 0;};class factory_A : public factory{public: shape* creat(){ return new circle(); }};class factory_B : public factory{public: shape* creat(){ return new rectange(); }};int main(){ factory* fac1 = new factory_A(); factory* fac2 = new factory_B(); fac1->creat()->start(); fac2->creat()->start(); return 0;}
抽象工厂模式
抽象工厂模式即把产品抽象成系列产品,具体产品从这些抽象产品继承获得,工厂也提供调用系列产品的接口。
优点:新加产品时,不需要修改产品类。
#include <iostream>using namespace std;// 定义两个系列产品,可以衍生其他具体产品型号class shape1{ public: virtual void start() = 0;};class shape2{ public: virtual void start() = 0;};class circle1 : public shape1{ public: void start(){ cout << "circle1" << endl; }};class rectange1 : public shape1{ public: void start(){ cout << "rectange1" << endl; }};class circle2 : public shape2{ public: void start(){ cout << "circle2" << endl; }};class rectange2 : public shape2{ public: void start(){ cout << "rectange2" << endl; }};class factory{ public: virtual shape1* creat1() = 0; virtual shape2* creat2() = 0;};class factory_A : public factory{public: shape1* creat1(){ return new circle1(); } shape2* creat2(){ return new circle2(); }};class factory_B : public factory{public: shape1* creat1(){ return new rectange1(); } shape2* creat2(){ return new rectange2(); }};int main(){ factory* fac1 = new factory_A(); factory* fac2 = new factory_B(); fac1->creat1()->start(); fac1->creat2()->start(); fac2->creat1()->start(); fac2->creat2()->start(); return 0;}
当要增加一个rectangle3时,只需要从shape1派生出rectangle3,然后扩展一个工厂类rectangle3,即可实现。代码如下:
#include <iostream>using namespace std;// 定义两个系列产品,可以衍生其他具体产品型号class shape1{ public: virtual void start() = 0;};class shape2{ public: virtual void start() = 0;};class circle1 : public shape1{ public: void start(){ cout << "circle1" << endl; }};class rectange1 : public shape1{ public: void start(){ cout << "rectange1" << endl; }};class rectange3 : public shape1{ public: void start(){ cout << "rectange3" << endl; }};class circle2 : public shape2{ public: void start(){ cout << "circle2" << endl; }};class rectange2 : public shape2{ public: void start(){ cout << "rectange2" << endl; }};class factory{ public: virtual shape1* creat1() = 0; virtual shape2* creat2() = 0;};class factory_A : public factory{public: shape1* creat1(){ return new circle1(); } shape2* creat2(){ return new circle2(); }};class factory_B : public factory{public: shape1* creat1(){ return new rectange1(); } shape2* creat2(){ return new rectange2(); }};class factory_C : public factory{public: shape1* creat1(){ return new rectange3(); } shape2* creat2(){ return new rectange2(); }};int main(){ factory* fac1 = new factory_A(); factory* fac2 = new factory_B(); factory* fac3 = new factory_C(); fac3->creat1()->start(); fac1->creat1()->start(); fac1->creat2()->start(); fac2->creat1()->start(); fac2->creat2()->start(); return 0;}
阅读全文
0 0
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之---工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之-工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之工厂模式
- 设计模式之 ------工厂模式
- 设计模式之工厂模式
- 39-逗号操作符的分析
- Java知识结构图
- 树和二叉树的应用
- ffmpeg+SDL2 实现简单播放器
- 怎样才能赚到钱系列(二)
- 设计模式之工厂模式
- HDU
- 简单明了理解java中的“==”和“equals”的区别
- LeetCode 560 Subarray Sum Equals K
- SSM综合项目实战(TTSC) -- day12 购物车
- [BZOJ2440][中山市选2011]完全平方数(二分+容斥)
- web.xml之context-param,listener,filter,servlet加载顺序及其周边
- 微服务应用概念整理
- #java#对十个到多个数进行排序