在qml中动态创建一个对象时可以使用创建型的设计模式。例如使用简单工厂模式。
看看uml图
通过一个工厂的一个方法,返回用户要求的产品,大致就是简单工厂模式了吧~
主要角色
工厂角色
抽象产品角色
具体产品角色
用户角色 (这个角色其实很重要,影响到了产品创建的内部细节)
看看怎么使用qml来实现上诉模式吧。与平常的简单工厂模式有所不同,但思路都是一样的。只是在qml中要考虑对象的管理。
先看看qml工程结构
| SampleFactory.qmlproject
| + Product
| | ProductA.qml
| | ProductB.qml
| SampleFactory.qml
| main.qml
工程根目录下游一个SampleFactory的qmltype
先看看SampleFactory.qml (工厂角色)
/*
* sample factory
*/
import QtQuick 2.4
QtObject {
id:sampleFactory;
// virtual public function
function 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 parent
function __createObjectFromUrl(url,p){
var component = Qt.createComponent(url);
if (component.status == Component.Ready) {
return component.createObject(p);
}
}
}
在看看main.qml(用户)
import QtQuick 2.4
import QtQuick.Controls 1.2
Rectangle {
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的叫法)和空对象模式。