qml设计模式之简单工厂模式

在qml中动态创建一个对象时可以使用创建型的设计模式。例如使用简单工厂模式。

看看uml图

参考文章

通过一个工厂的一个方法,返回用户要求的产品,大致就是简单工厂模式了吧~

主要角色

工厂角色

抽象产品角色

具体产品角色

用户角色 (这个角色其实很重要,影响到了产品创建的内部细节)

看看怎么使用qml来实现上诉模式吧。与平常的简单工厂模式有所不同,但思路都是一样的。只是在qml中要考虑对象的管理。

先看看qml工程结构

| SampleFactory.qmlproject| + Product| | ProductA.qml| | ProductB.qml| SampleFactory.qml| main.qml

Product文件夹下有两个具体的Product类,(其实就是Rectangle),就不贴出代码了,重点在下面的工厂和用户

工程根目录下游一个SampleFactory的qmltype

先看看SampleFactory.qml (工厂角色)

/* * sample factory*/import QtQuick 2.4QtObject {id:sampleFactory;// virtual public functionfunction createProduct(type,p){switch(type){case "A":return __createObjectFromUrl("./Product/ProductA.qml",p);case "B":return __createObjectFromUrl("./Product/ProductB.qml",p);default:return null;}}// private function// url : qml file path// p : qml object parentfunction __createObjectFromUrl(url,p){var component = Qt.createComponent(url);if (component.status == Component.Ready) {return component.createObject(p);}}}在看看main.qml(用户)import QtQuick 2.4import QtQuick.Controls 1.2Rectangle {id:user;width: 400;height: 400;SampleFactory{ id:sampleFactory; }Row{Button{text:"A"onClicked: {var product = sampleFactory.createProduct("A",user);if(product){product.x = Math.random() * user.width}}}Button{text:"B"onClicked: {var product = sampleFactory.createProduct("B",user);if(product){product.y = Math.random() * user.height}}}}}main.qml(用户)通过一个工厂,使用其createProduct()函数来构建对象,,产生的对象由用户接管(因为用户拥有产品的一切,所以用户对产品由生杀大权)。

在看看工厂角色的createProduct()函数,其内部使用一个switch分支来确定输入的类型是否是存在,如果存在,就返回对应类型的对象,如果不存在就返回null。

这里的缺点是如果传入的对象类型不存在,或者工厂内部产品琳琅满目时,就会变得难以维护。

在下一篇文章中会给出一个折中的解决办法,反射(java的叫法)和空对象模式。

发光并非太阳的专利,我也可以发光 。

qml设计模式之简单工厂模式

相关文章:

你感兴趣的文章:

标签云: