设计模式-工厂模式



  • 设计模式-工厂模式

    使用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

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

    read more
  • G

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

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

    read more

关注我们

微博
QQ群