创建型模式的关注点是“怎样创建对象?”,降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。
包括:
单例模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
原型模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
工厂方法模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
抽象工厂模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
建造者模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
单例模式:为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例。
实现:普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。
具体应用:
在每一届任期内,美国的总统只有一人,适合用单例模式实现。
第一步:类函数定义
#pragma once
#include <iostream>
using namespace std;
#include <mutex>
std::mutex mt;
class President
{
private:
static President *instance;
//避免类在外部实例化
President(){}
public:
//在方法上加同步
static President* getInstance();
void getName();
};
第二步: 类函数实现
//在此处初始化
President* President::instance = new President();
President* President::getInstance()
{
mt.lock();
if(instance==NULL)
{
instance=new President();
}
else
{
cout<<"已经有一个总体,不能产生新总统!"<<endl;
}
mt.unlock();
return instance;
}
void President::getName()
{
cout<<"我是美国总统!"<<endl;
}
第三步: 主函数实现
int main()
{
President *p1=President::getInstance();
// p1->getInstance();
p1->getName();
President *p2=President::getInstance();
// p2->getInstance();
p2->getName();
if(p1==p2)
{
cout<<"他们是同一个人"<<endl;
}
else
{
cout<<"他们不是同一个人"<<endl;
}
}
结果显示: