设计模式--创建型模式

简介

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

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 << "\n----------------------------------\n";
        cout << name << endl;
        auto p = Singleton::Instance(name);
        if (p)
        {
            cout << p->Name() << endl;
        }
        else
        {
            cout << "fail" << endl;
        }
    }
}

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

posted @ 2021-05-23 16:14  castchen  阅读(47)  评论(0编辑  收藏  举报