学习笔记:关注C++设计模式之Factory模式
2011-10-18 00:38
477 查看
#ifndefFACTORY_H #defineFACTORY_H classProduct; classFactory { public: virtual~Factory()=0; virtualProduct*CreateProduct()=0; protected: Factory(); private: }; classConcreateFactory:publicFactory { public: ~ConcreateFactory(); ConcreateFactory(); Product*CreateProduct(); protected: private: }; #endif//FACTORY_H
#include"Factory.h" #include"Product.h" #include<iostream> usingnamespacestd; Factory::Factory() { } Factory::~Factory() { } ConcreateFactory::ConcreateFactory() { cout<<"ConcreteFactory...."<<endl; } ConcreateFactory::~ConcreateFactory() { } Product*ConcreateFactory::CreateProduct() { returnnewConcreteProduct(); }
#ifndefPRODUCT_H #definePRODUCT_H classProduct { public: virtual~Product()=0; protected: Product(); private: }; classConcreteProduct:publicProduct { public: ~ConcreteProduct(); ConcreteProduct(); protected: private: }; #endif//PRODUCT_H
#include"Product.h" #include<iostream> usingnamespacestd; Product::Product() { } Product::~Product() { } ConcreteProduct::ConcreteProduct() { cout<<"ConcreteProduct......."<<endl; } ConcreteProduct::~ConcreteProduct() { }
#include"Factory.h" #include"Product.h" #include<iostream> intmain(intargc,char*argv[]) { Factory*fac=newConcreateFactory();//为什么是一个抽象类的指针?为什么要这样用? Product*p=fac->CreateProduct(); return0; }
它的模型如下:模型的用意是,定义创建对象的接口,封装对象的创建,将对象的创建放到子类中实现,使得具体化类的工作延迟到了子类中
这个模型的一些疑问解决:
首先要知道父类指针指向子类实例对象的知识点
几点知识:
无论父类里面有没有虚函数,都可以定义指向子类实例的父类指针.
如果父类里没有虚函数,则使用父类指针,只能访问父类的成员,而不能访问子类里的成员.
如果父类里的虚函数不是纯虚函数,且子类里没有重写该虚函数,则用父类指针访问该虚函数的时候,跟访问父类里的普通函数一样.
如果父类里的虚函数不是纯虚函数,且子类里重写了该虚函数,则用父类指针访问该虚函数的时候访问的是子类里重写后的函数.
如果父类里的虚函数是纯虚函数,则父类是个抽象类,子类要想能够被实例化,则必须重写该纯虚函数.用父类指针访问该纯虚函数的时候,访问到的是子类里重写了的函数.
再有一个要注意的是析构函数要声明为虚函数,这样在delete父类指针的时候,才会调用实例化的子类的虚函数,否则只会调用父类的析构函数,造成子类的剩余部分没被释放,从而造成内存的泄漏.
用C++比较好说明白:
1:指针的可访问性是由指针的定义决定的,比如说用BaseClass定义的指针,可访问的范围就是BaseClass的内存区域
2:允许用一个指向基类的指针指向派生类,由于被指向的对象的内存空间大于指针的可访问空间,所以这种向上映射是安全的
3:对象在调用虚函数的时候,是调用父类的函数还是调用派生类的函数,是和对象的类型有关的,比如说一个派生类B,其父类是A,则B的对象调用父类中被声明为VIRTUAL的函数时,被B所OVERRIDE的函数调用的是B里的函数,而B没有OVERRIDE的函数调用的是基类里的函数
部分内容如下:
例如: classa { public: intaa }; classb:publica { public: intbb; }; 从内存的来看 如a ---------| |占一个int数据大小--| |----(aa数据)------| |--------- 而b则是 ---------|--------- |占一个int数据大小--|占一个Int数据大小--| |从a中继承而来------|---(bb数据----------| |------------------ 当定义一个基类类型的指针时 a*p;这时,这个指针指向的是a类型的数据 当p指针指向派生类的时候,因为p是a类型的指针,所以*p只解释为a类型数据的长度,即 ————————-|--------- |占一个int数据大小--|占一个Int数据大小--| |从a中继承而来------|-----(bb数据)-------| |------------------ |------------|------------| |-p只指向这个区域_--| 因此,当基类的指针(P)指向派生类的时候,只能操作派生类中从基类中继承过来的数据。 指向派生类的指针,因为内存空间比基类长,会导致严重了后果,所以不允许派生类的指针指向基类。而基类的指针可以指向派生类。 C++的多态性能解决基类指针不能操作派生类的数据成员的问题。
相关文章推荐
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 学习笔记:关注C++设计模式之AbstractFactory模式
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 学习笔记:关注C++设计模式之Singleton模式
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之五(Factory Method工厂方法模式)
- 设计模式C++学习笔记之一(Strategy策略模式)
- 设计模式C++学习笔记之二(Proxy代理模式)
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 设计模式C++学习笔记之十(Builder建造者模式)
- 设计模式C++学习笔记之八(Adapter适配器模式)
- 设计模式C++学习笔记之十九(State状态模式)
- 设计模式学习笔记--工厂(Factory)、建造(Builder)和原型(Prototype)
- 设计模式C++学习笔记之一(Strategy策略模式)
- 设计模式C++学习笔记之一(Strategy策略模式)
- 设计模式C++学习笔记之十八(Visitor访问者模式)
- 设计模式C++学习笔记之十四(Iterator迭代器模式)
- 设计模式C++学习笔记之一(Strategy策略模式)
- 设计模式C++学习笔记之八(Adapter适配器模式)