设计模式--创建型模式
简介
创建型模式,顾名思义,就是当你实例化一个对象时所采用的设计模式。
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是以两种不同的方式进行初始化的,各有利弊,可以看情况来选择适合的方式。