当前位置: 首页 > wzjs >正文

51单片机可以做网站销售推广

51单片机可以做网站,销售推广,电子商务网站建设评估工具有哪些,wordpress页面加载很慢设计模式之工厂模式(一) 在阅读Qt网络部分源码时候,发现在某处运用了工厂模式,而且编程技巧也用的好,于是就想分享出来,供大家参考,理解的不对的地方请多多指点。 以下是我整理出来的类图: 关键说明&#x…

  设计模式之工厂模式(一)

        在阅读Qt网络部分源码时候,发现在某处运用了工厂模式,而且编程技巧也用的好,于是就想分享出来,供大家参考,理解的不对的地方请多多指点。

        以下是我整理出来的类图:

关键说明:

1.Q_GLOBAL_STATIC(QSocketEngineHandlerList, socketHandlers)

Qt实现单例模式:Q_GLOBAL_STATIC和Q_GLOBAL_STATIC_WITH_ARGS_qt 单例宏-CSDN博客

Q_GLOBAL_STATIC宏定义了一个全局变量,这个全局变量是定义在qabstractsocketengine.cpp中,它的定义如下:

class QSocketEngineHandlerList : public QList<QSocketEngineHandler*>
{
public:QMutex mutex;
};Q_GLOBAL_STATIC(QSocketEngineHandlerList, socketHandlers)

在cpp中定义,其它地方是访问不到这个全局变量,隐藏了实现,封装性比较好。

2.QAbstractSocketEngine和QHttpSocketEngine

在工厂模式中这个类就相当于是需要生产的对象,它是一个接口类,一般都是通过继承它来实现具体的功能。本例中QHttpSocketEngine就是实际的具有某个功能的类。

3.QSocketEngineHandler

这个类类似工厂模式中的工厂,它的定义如下:

class Q_AUTOTEST_EXPORT QSocketEngineHandler
{
protected:QSocketEngineHandler();virtual ~QSocketEngineHandler();virtual QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType,const QNetworkProxy &, QObject *parent) = 0;virtual QAbstractSocketEngine *createSocketEngine(qintptr socketDescriptor, QObject *parent) = 0;private:friend class QAbstractSocketEngine;
};
QSocketEngineHandler::QSocketEngineHandler()
{if (!socketHandlers())return;QMutexLocker locker(&socketHandlers()->mutex);socketHandlers()->prepend(this);
}QSocketEngineHandler::~QSocketEngineHandler()
{if (!socketHandlers())return;QMutexLocker locker(&socketHandlers()->mutex);socketHandlers()->removeAll(this);
}

从上面的代码可以看出,在QSocketEngineHandler的构造函数和析构函数分别去注册和移除工厂,让继承QSocketEngineHandler的类也不用暴露socketHandlers,这个地方也是写的比较巧妙的地方。

4.QHttpSocketEngineHandler

具体的工厂类,负责生产QHttpSocketEngine,代码如下:

class Q_AUTOTEST_EXPORT QHttpSocketEngineHandler : public QSocketEngineHandler
{
public:virtual QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType,const QNetworkProxy &, QObject *parent) override;virtual QAbstractSocketEngine *createSocketEngine(qintptr socketDescripter, QObject *parent) override;
};
QAbstractSocketEngine *QHttpSocketEngineHandler::createSocketEngine(QAbstractSocket::SocketType socketType,const QNetworkProxy &proxy,QObject *parent)
{if (socketType != QAbstractSocket::TcpSocket)return 0;// proxy type must have been resolved by nowif (proxy.type() != QNetworkProxy::HttpProxy)return 0;// we only accept active socketsif (!qobject_cast<QAbstractSocket *>(parent))return 0;QHttpSocketEngine *engine = new QHttpSocketEngine(parent);engine->setProxy(proxy);return engine;
}QAbstractSocketEngine *QHttpSocketEngineHandler::createSocketEngine(qintptr, QObject *)
{return 0;
}

5.createSocketEngine()

在QAbstractSocketEngine类有两个静态函数,就是生产对象的入口:

class Q_AUTOTEST_EXPORT QAbstractSocketEngine : public QObject
{Q_OBJECT
public:static QAbstractSocketEngine *createSocketEngine(QAbstractSocket::SocketType socketType, const QNetworkProxy &, QObject *parent);static QAbstractSocketEngine *createSocketEngine(qintptr socketDescriptor, QObject *parent);QAbstractSocketEngine(QObject *parent = 0);...
};
QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(QAbstractSocket::SocketType socketType, const QNetworkProxy &proxy, QObject *parent)
{
#ifndef QT_NO_NETWORKPROXY// proxy type must have been resolved by nowif (proxy.type() == QNetworkProxy::DefaultProxy)return 0;
#endifQMutexLocker locker(&socketHandlers()->mutex);for (int i = 0; i < socketHandlers()->size(); i++) {if (QAbstractSocketEngine *ret = socketHandlers()->at(i)->createSocketEngine(socketType, proxy, parent))return ret;}#ifndef QT_NO_NETWORKPROXY// only NoProxy can have reached hereif (proxy.type() != QNetworkProxy::NoProxy)return 0;
#endifreturn new QNativeSocketEngine(parent);
}QAbstractSocketEngine *QAbstractSocketEngine::createSocketEngine(qintptr socketDescripter, QObject *parent)
{QMutexLocker locker(&socketHandlers()->mutex);for (int i = 0; i < socketHandlers()->size(); i++) {if (QAbstractSocketEngine *ret = socketHandlers()->at(i)->createSocketEngine(socketDescripter, parent))return ret;}return new QNativeSocketEngine(parent);
}

在函数createSocketEngine中依次循环调用socketHandlers()来创建QAbstractSocketEngine,这里的类型过滤是在具体的创建函数中,比如QHttpSocketEngineHandler::createSocketEngine。

6.总结

        虽然工厂模式并不复杂,但是要在实际项目中灵活运用,也不是一件容易的事,希望我的分享会对你更好的理解工厂模式。

http://www.dtcms.com/wzjs/488455.html

相关文章:

  • 信息平台网站的建设 文档seo搜索引擎优化课程总结
  • wordpress采集 知乎做灰色词seo靠谱
  • 可以写代码的网站app推广方案范例
  • 不拦截网站的浏览器株洲seo排名
  • 精美 企业网站模板竞价账户
  • 做视频编辑哪个网站素材比较好网络营销的模式有哪些?
  • 许昌那有做网站自动引流推广app
  • 石家庄网站建设推广公司报价人民日报最新新闻
  • 做网站还需要服务器吗加盟教育培训机构
  • 国外做评论的网站女生做sem还是seo
  • 视频网站用什么做网站外链出售
  • 秒收网站网络营销的特点有哪些特点
  • 大兴黄村网站建设公司营销型网站建设设计
  • 网站开发后端做那些互联网营销的五个手段
  • 海外公司注册代办长沙网络优化产品
  • 做网站用什么主机好软文营销广告案例
  • 重庆网站建设重庆营销策划公司排名
  • 赚钱做任务的网站有哪些简单的html网页制作
  • b2c网站可使用的交易功能网站提交入口百度
  • 没有做老千的斗牛网站6杭州seo排名优化外包
  • 例举常用动态网站开发技术重庆网站设计
  • 想给公司产品做个推广搜索引擎优化课程总结
  • 学到什么程度可以做网站推广普通话的内容
  • 微信平台的微网站怎么做开发一个app需要多少钱?
  • ctb自己做网站网络营销推广平台
  • 免费咨询婚姻律师回答在线cpu优化软件
  • 怎样做网站后台seo外链优化策略
  • 许昌市建设投资有限公司 网站信息发布网站有哪些
  • 帝国cms 孕婴网站模板seo实战
  • 网站服务器用什么配置创建个人网站的流程