毕业一年多,好久没写csdn了,还需要多多充电,多多学习,多多记录,多多总结,上学时也学过设计模式,但是没在做过大项目,也没用过,也只是看过了,一知半解,工作后项目中的界面框架大佬使用了工厂模式,最近仔细学习了下其中的内容,在此总结作为记录:希望能在合适的地方用到它,看到这篇文章的人也请多多指教:
1.本人对于聚合与组合分不太清,如果看到此文章,就请您多多指教啦,举例指导一下,谢谢!
2.对于虚函数与纯虚函数在使用过程中才会更懂!
一个简单工厂:
#ifndef SIGNALFACTORY_H#define SIGNALFACTORY_Hclass SignalFactory:public QObject{Q_OBJECTpublic:explicit SignalFactory(int productType, QObject *parent = 0);~SignalFactory();void mainInterfaceInit();//根据配置文件初始化不同的界面void mainModelInit();//初始化模块信息,如数据库、消息系统等QWidget *getMainInterface();//获取主界面QWidget *getLoginInterface();//获取登录界面signals:public slots:privte:AbstractProduct * p_abstractProduct;//产品抽象类为简单工厂的成员变量【聚合还是组合,如果是聚合则是has a的关系】};#endif // SIGNALFACTORY_HSignalFactory::SignalFactory(int productType, QObject *parent )
: QObject(parent){
p_abstractProduct = NULL;
switch(productType)
{
case priductA:
p_abstractProduct = new ProductA();//new实体类A
break;
case productB:
p_abstractProduct = new ProductB();//new实体类B
break;
default
break;
}
}
产品抽象类:含有纯虚函数的类为抽象类,只含有虚函数的类不能被称为抽象类
下面的实体类A与B public 继承产品抽象类,是 is a 的关系
#ifndef ABSTRACTPRODUCT_H#define ABSTRACTPRODUCT_Hclass AbstractProduct:public QObject{Q_OBJECTpublic:explicit AbstractProduct(QObject *parent = 0);~AbstractProduct();virtual void mainInterfaceInit() = 0;//根据配置文件初始化不同的界面 纯虚函数virtual void mainModelInit();//初始化模块信息,如数据库、消息系统等 虚函数virtual void mainModelInitExt() = 0;//额外模块初始化,如称重智能柜要初始化称重传感器模块virtual QWidget *getMainInterface() = 0;//获取主界面virtual QWidget *getLoginInterface() = 0;//获取登录界面signals:public slots:private:public://创建界面类实体}#endif // ABSTRACTPRODUCT_H
产品实体类A
#ifndef PRODUCTA_H#define PRODUCTA_Hclass ProductA:public AbstractProduct{Q_OBJECTpublic:explicit ProductA(QObject *parent = 0);~ProductA();void mainInterfaceInit();//根据配置文件初始化不同的界面void mainModelInit();//初始化模块信息,如数据库、消息系统等QWidget *getMainInterface();//获取主界面QWidget *getLoginInterface();//获取登录界面signals:public slots:private:};#endif // PRODUCTA_H产品实体类B
#ifndef PRODUCTB_H#define PRODUCTB_Hclass ProductB:public AbstractProduct{Q_OBJECTpublic:explicit ProductB(QObject *parent = 0);~ProductB();void mainInterfaceInit();//根据配置文件初始化不同的界面void mainModelInit();//初始化模块信息,如数据库、消息系统等QWidget *getMainInterface();//获取主界面QWidget *getLoginInterface();//获取登录界面signals:public slots:private:};#endif // PRODUCTB_H
虚函数与纯虚函数的区别
1、虚函数必须实现,不实现编译会报错;而纯虚函数不能实现;
2、虚函数与纯虚函数可以定义在一个类中,但是类中不含有纯虚函数就不被称为抽象类;
3、虚函数可以直接被使用,也可以在子类中实现后以多态的形式调用,而纯虚函数必须由继承它的子类实现后使用;
4、虚函数与纯虚函数通常存在于抽象类中,被继承的子类重载,其目的是提供一个统一的接口;
5、虚函数与纯虚函数不能有static标识符,由于static是静态绑定,前期需要bind,虚函数与纯虚函数为动态绑定,其生命周期不同;
6、虚函数在C++中用于多态,其核心理念通过基类访问派生类;
7、多态性指相同对象收到不同消息或者不同对象收到相同消息时产生的不同实现动作;
8、C++支持俩种多态性,编译时多态性:通过重载函数实现;运行时多态性:通过虚函数实现;
类关系聚合与组合
聚合:A消亡,B不一定消亡;A创建,B不一定 has a的关系
组合:A消亡,B消亡;A创建,B创建 contains a的关系