• 设计模式--创建型模式


    简介

    创建型模式,顾名思义,就是当你实例化一个对象时所采用的设计模式。

    Abstarct Factory - 抽象工厂

    抽象工厂用于创建一系列相关的对象。

    Builder - 生成器

    生成器用于创建复杂的对象,一步步的创建对象的一部步,然后进行返回。

    Factory Method - 工厂方法

    工厂方法实现在使用者的内部,不像前两种方法是传入参数,然后使用参数进行构建。

    Prototype - 原型

    原型可以传递给使用者一个例子指针,使用者使用指针对象的clone操作来创建新的对象,适用于写框架。

    Singleton - 单件

    单件也叫单例,很常用的模式。有一种可以特别注意下:单例基类并不用来实例化,用来保存一个单例实例列表,这样可以实例化多种单例,用参数来读取。见代码。
    singleton.h

    #pragma once
    
    #include <string>
    #include <unordered_map>
    #include <iostream>
    
    using namespace std;
    
    class Singleton
    {
    public:
        static Singleton* Instance(const string& name);
    
        void Register(const string& name, Singleton* p);
    
        virtual string Name() { return typeid(*this).name(); }
    
    protected:
        Singleton() { cout << "Singleton" << endl; }
    
        static Singleton* LookUp(const string& name);
    
    private:
        static unordered_map<string, Singleton*> _list;
    };
    
    

    singleton.cpp

    #include "singleton.h"
    
    unordered_map<string, Singleton*> Singleton::_list;
    
    Singleton* Singleton::Instance(const string& name)
    {
        return LookUp(name);
    }
    
    void Singleton::Register(const string& name, Singleton* p)
    {
        _list[name] = p;
    }
    
    Singleton* Singleton::LookUp(const string& name)
    {
        if (_list.find(name) == _list.end())
            return nullptr;
        return _list[name];
    }
    
    

    singleton1.h

    #pragma once
    
    #include <iostream>
    
    #include "singleton.h"
    
    class Singletion1 final
        : public Singleton
    {
    private:
        Singletion1()
        {
            std::cout << "1" << std::endl;
            Register("1", this);
        }
    
    private:
        static Singletion1* _instance;
    };
    
    

    singleton1.cpp

    #include "singleton1.h"
    
    Singletion1* Singletion1::_instance = new Singletion1();
    
    

    singleton2.h

    #pragma once
    
    #include <iostream>
    
    #include "singleton.h"
    
    class Singletion2 final
        : public Singleton
    {
    public:
        Singletion2()
        {
            std::cout << "2" << std::endl;
            Register("2", this);
        }
    };
    
    static Singletion2 _instance;
    
    

    main.cpp

    #include <iostream>
    #include <vector>
    
    #include "singleton.h"
    
    using namespace std;
    
    int main()
    {
        vector<string> name_list{ "1", "2" };
    
        for (const auto& name : name_list)
        {
            cout << "
    ----------------------------------
    ";
            cout << name << endl;
            auto p = Singleton::Instance(name);
            if (p)
            {
                cout << p->Name() << endl;
            }
            else
            {
                cout << "fail" << endl;
            }
        }
    }
    
    

    以上代码中,singleton1和singleton2是以两种不同的方式进行初始化的,各有利弊,可以看情况来选择适合的方式。

  • 相关阅读:
    云计算被视为继大型计算机、个人计算机、互联网之后的第4次IT产业革命,顺应了当前各行业整合计算资源和服务能力的要求(转)
    hdu1172猜数字
    or1200构建sopc系统之软件环境搭建
    Log4cpp介绍及使用
    JAVA实现HTTPserver端
    站点防止攻击
    opencv是什么
    RBAC权限管理
    一分钟制作U盘版BT3
    为开发用途mac电脑瘦身
  • 原文地址:https://www.cnblogs.com/RookieSuperman/p/14801383.html
Copyright © 2020-2023  润新知