设计模式-工厂模式



  • 设计模式-工厂模式

    使用qt/qml来演示设计模式效果,便于学习理解

    1)定义创建对象的接口,封装对象的创建
    2)使具体化类的工作延迟到工厂子类中

    bg.png
    image.png

    1. 工厂类

    createProduct使用了参数来选择要创建哪个产品

    #ifndef FACTORY_H
    #define FACTORY_H
    #include <QObject>
    
    class Product;
    class QString;
    class Factory: public QObject
    {
        Q_OBJECT
    public:
        virtual ~Factory() = 0;
        virtual Product* createProduct(QString type) = 0;
    protected:
        Factory();
    };
    
    class ConcreteFactory: public Factory
    {
        Q_OBJECT
    public:
        ~ConcreteFactory();
        ConcreteFactory();
    
    public slots:
        Product* createProduct(QString type);
    };
    
    #endif // FACTORY_H
    
    
    #include "factory.h"
    #include "product.h"
    #include <QtQml/qqml.h>
    Factory::~Factory()
    {
    
    }
    
    Factory::Factory()
    {
        qmlRegisterType<Product>("Product", 1, 0, "Product");
    }
    
    ConcreteFactory::~ConcreteFactory()
    {
    }
    
    ConcreteFactory::ConcreteFactory()
    {
    }
    
    Product *ConcreteFactory::createProduct(QString type)
    {
        if(type == "boy")
            return static_cast<Product *>(new ConcreteProduct1());
        else if(type == "girl")
            return static_cast<Product *>(new ConcreteProduct2());
    
        return static_cast<Product *>(new ConcreteProduct1());
    }
    
    

    2 产品类

    一个产品是萌梦男,一个产品是萌梦女

    #ifndef PRODUCT_H
    #define PRODUCT_H
    
    #include <QObject>
    
    class Product: public QObject
    {
        Q_OBJECT
    public:
        virtual ~Product() = 0;
        Q_PROPERTY(QString icon READ icon NOTIFY iconChanged)
        QString m_icon;
    
        QString icon() const
        {
            return m_icon;
        }
    signals:
        void iconChanged(QString icon);
    protected:
        Product();
    
    signals:
    
    public slots:
    };
    
    class ConcreteProduct1: public Product
    {
        Q_OBJECT
    public:
        ~ConcreteProduct1();
        ConcreteProduct1();
    };
    
    class ConcreteProduct2: public Product
    {
        Q_OBJECT
    public:
        ~ConcreteProduct2();
        ConcreteProduct2();
    };
    
    #endif // PRODUCT_H
    
    
    #include "product.h"
    Product::~Product()
    {
    
    }
    
    Product::Product()
    {
    
    }
    
    ConcreteProduct1::~ConcreteProduct1()
    {
    
    }
    
    ConcreteProduct1::ConcreteProduct1()
    {
        m_icon = "qrc:/images/boy.png";
    }
    
    ConcreteProduct2::~ConcreteProduct2()
    {
    
    }
    
    ConcreteProduct2::ConcreteProduct2()
    {
        m_icon = "qrc:/images/girl.png";
    }
    
    

    3. main.qml

    使用timer,canvas,listview等实现一个自动化生产的动画效果

    源代码

    Fork me on Gitee


Log in to reply
 

最近的回复

  • G

    北京名律免费法律咨询,解决您的法律困扰,如果您眼下没有遇到法律上的问题,也可以留一位大律师的联系方式以备不时之需!

    read more
  • 还是挺好看的,有趣儿!

    read more
  • 1479831431.jpg
    这个年由于新型冠状病毒疫情,我被迫在家里。我当时就想,怎样学习一下PBRT,因为这个毕竟是比较重要的内容。
    我于是获取到了著名的《Physically Based Rendering》资料。现在已经第三版了。看来发展得很快。
    第一个版本是2004年发布的,而第二个版本则是2010年发布的。在这些年,渲染技术已经发展得很快,并且
    得到了很多的拥趸。我曾经仔细地看了一遍这本书,发现还是不理解。这就非常头疼了。书中介绍的一些渲染
    的技巧,对于一个从0开始的初学者来说,的确是复杂了许多。但是他们也都是一点一点开始搭建起来的,我
    想,只要找到了正确的学习方法,还是能够顺利地达到他们那个阶段的。

    在寻找渲染技术的路上,我寻找很多的方法。
    知乎:如何阅读PBRT3?
    https://www.zhihu.com/question/309420057/answer/576382644

    后面找到一个稍微简单的《Ray Tracing in a Weekend》
    简书:【笔记】Ray Tracing in a Weekend
    https://www.jianshu.com/p/dc801008ee27?from=groupmessage&isappinstalled=0

    现在的阶段,可能会参考一下《Ray Tracing in a Weekend》结合简书的介绍来慢慢学习PBRT了。

    read more
  • @LemonHX 也有,随时可以构建的呢。

    read more

关注我们

微博
QQ群