设计模式—工厂模式
2017-07-09 19:55
218 查看
利用设计模式思想编写软件的目的主要在于:使得代码可维护、可复用、可扩展、灵活性好。
1 前提知识
C++ 多态、虚函数。可参考:
http://blog.csdn.net/bao_jinyu/article/details/7843275
https://www.zhihu.com/question/23971699
在此作一简要归纳:
虚函数:
(1) 是C++ 实现多态的机制,动机在于:通过基类访问派生类定义的函数、关于这一点,下面就可以很快看到。
(2)虚函数 C++的实现方法是在于,当编译器发现一个类中有被声明为virtual的函数,就会为其建立一个虚函数表—VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生类有自己的VTABLE,而且派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。
2 工厂模式
(1) 主要用于创建对象。新添加类时,不会影响以前的系统代码。
(2) 核心思想是用一个工厂类来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。
reference:
http://blog.csdn.net/bao_jinyu/article/details/7843275
https://www.zhihu.com/question/23971699
http://download.csdn.net/download/lixiang2202/5543325#
1 前提知识
C++ 多态、虚函数。可参考:
http://blog.csdn.net/bao_jinyu/article/details/7843275
https://www.zhihu.com/question/23971699
在此作一简要归纳:
虚函数:
(1) 是C++ 实现多态的机制,动机在于:通过基类访问派生类定义的函数、关于这一点,下面就可以很快看到。
(2)虚函数 C++的实现方法是在于,当编译器发现一个类中有被声明为virtual的函数,就会为其建立一个虚函数表—VTABLE。VTABLE实际上是一个函数指针的数组,每个虚函数占用这个数组的一个slot。一个类只有一个VTABLE,不管它有多少个实例。派生类有自己的VTABLE,而且派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置上。在创建类实例的时候,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE。
2 工厂模式
(1) 主要用于创建对象。新添加类时,不会影响以前的系统代码。
(2) 核心思想是用一个工厂类来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。
class COperation //定义基类 { public: int a, b; virtual double GetResult(){ return 0.0; } COperation(){}; ~COperation(){}; }; class AddOperation:public COperation { public: virtual double GetResult(){ return a+b; } AddOperation(){}; ~AddOperation(){}; }; class SubOperation:public COperation { public: SubOperation(){}; ~SubOperation(){}; double GetResult(){//不加关键字 virtual 也是虚函数 return a-b; } }; class CCalculatorFactory { public: CCalculatorFactory(){}; ~CCalculatorFactory(){}; static COperation * Create(char cOperator){ COperation *oper = nullptr;//通过基类指针,利用虚函数表,去访问子类的方法 switch (cOperator) { case '+': oper = new AddOperation(); break; case '-': oper = new SubOperation(); break; default: break; } return oper; } }; /////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { COperation *op = CCalculatorFactory::Create('+');//基类指针,指向其派生类AddOperation的对象。 op->a = 1; op->b = 2; cout << op->GetResult() << endl; return 0; }
reference:
http://blog.csdn.net/bao_jinyu/article/details/7843275
https://www.zhihu.com/question/23971699
http://download.csdn.net/download/lixiang2202/5543325#
相关文章推荐
- 设计模式—工厂模式
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- 重构 - 理解设计模式的捷径(4 设计模式的引入 - 工厂模式)
- 设计模式之3个工厂模式
- [Gof设计模式]简单工厂模式和工厂模式的C++实现
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- 设计模式 简单工厂模式和工厂模式的区别
- 设计模式随笔-从“有病”说起(工厂模式前传)
- 设计模式学习(二)简单工厂模式-工厂模式-抽象工厂模式
- Java 设计模式-工厂模式
- 设计模式-工厂模式(手工作坊到工业化的转变 c#实现)
- 设计模式之——工厂模式
- 设计模式(1)-工厂模式(Factory)
- 设计模式-工厂模式(手工作坊到工业化的转变 c#实现)
- (转帖) 设计模式随笔-从“有病”说起(工厂模式前传)
- 魔兽争霸之PHP设计模式-工厂模式[Factory]
- [转]C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
- 设计模式-工厂模式(手工作坊到工业化的转变 c#实现)