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.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的叫法)和空对象模式。





评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值