首页 > 其他分享 >26.单例模式

26.单例模式

时间:2022-09-30 20:33:47浏览次数:37  
标签:26 Printer 静态 pMaker 模式 单例 getMaker Maker

程序1:

#pragma warning(disable:4996)
//2022年9月30日20:00:15
#include <iostream>
using namespace std;

//单例模式是一个类只能实例化一个对象
class Maker
{
    //1.把构造函数私有化
private:
    Maker()
    {

    }
public:
    //静态成员函数,访问静态成员变量
    static Maker* getMaker()
    {
        return pMaker;
    }
private:
    static Maker* pMaker;
};

//3.在类外初始化,new一个对象
Maker *Maker::pMaker = new Maker;
void test()
{
    //Maker m;
    Maker* m = Maker::getMaker();
    Maker* m2 = Maker::getMaker();
    cout << "m = " << m << endl;
    cout << "m2 = " << m2 << endl;

    Maker m3 = *m;//调用拷贝构造
    cout << "m3 = " << &m3 << endl;
}

int main()
{
    test();
    system("pause");
    return EXIT_SUCCESS;
}

输出结果:

m = 0000028D54580FF0
m 2 = 0000028D54580FF0
请按任意键继续. . .

程序2:

#pragma warning(disable:4996)
//2022年9月30日20:00:15
#include <iostream>
using namespace std;

//单例模式是一个类只能实例化一个对象
class Maker
{
    //1.把无参构造函数和拷贝构造函数私有化
private:
    Maker()
    {

    }
    Maker(const Maker& m)
    {

    }
public:
    //静态成员函数,访问静态成员变量
    //4.把指针的权限设置为私有,然后提供一个静态成员函数让外面获取这个指针
    static Maker* getMaker()
    {
        return pMaker;
    }
private:
    //2.定义一个类内的静态成员指针
    static Maker* pMaker;
};

//3.在类外初始化,new一个对象
Maker *Maker::pMaker = new Maker;
void test()
{
    //Maker m;
    Maker* m = Maker::getMaker();
    Maker* m2 = Maker::getMaker();
    cout << "m = " << m << endl;
    cout << "m2 = " << m2 << endl;

    //Maker m3 = *m;//调用拷贝构造
    //cout << "m3 = " << &m3 << endl;
}

int main()
{
    test();
    system("pause");
    return EXIT_SUCCESS;
}

单例模式(重点难点)

1.单例模式是一个类只能实例化一个对象

2.实现单例模式的思路

​ A.把无参构造函数和拷贝构造函数私有化

​ B.定义一个类内的静态成员指针

​ C.在类外初始化时,new一个对象

​ D.把指针的权限设置为私有,然后提供一个静态成员函数让外面获取这个指针

//单例模式是一个类只能实例化一个对象
class Maker
{
	//1.把构造函数私有化
private:
	Maker()
	{
	}
	Maker(const Maker &m)
	{

	}
public:
	//静态成员函数,访问静态成员变量
	//4.把指针的权限设置为私有,然后提供一个静态成员函数让外面获取这个指针
	static Maker* getMaker()
	{
		return pMaker;
	}
private:
	//2.定义一个类内的静态成员指针
	static Maker *pMaker;
};
//3.在类外初始化时,new一个对象
Maker *Maker::pMaker = new Maker;//这里可以new是因为在Maker::作用域,编译器把它当成在类内

void test()
{
	//Maker m;
	Maker *m = Maker::getMaker();
	Maker *m2 = Maker::getMaker();
	cout << "m=" << m << endl;
	cout << "m2=" << m2 << endl;

	//Maker m3 = *m;//调用拷贝构造,这里会产生新对象,所以要把拷贝构造也私有化
	//cout << "m3=" << &m3 << endl;
}

3.单例模式案例(需求:获取打印机打印次数)

//需求,获取打印机使用的次数
class Printer
{
private:
	//1.把无参构造和拷贝构造私有化
	Printer()
	{
		mcount = 0;
	}
	Printer(const Printer &p)
	{

	}
public:
	static Printer *getPrinter()
	{
		return p;
	}

	void printPrinter(string name)
	{
		cout << name << ":打印" << endl;
		mcount++;
	}
	int getCount()
	{
		return mcount;
	}
private:
	int mcount;//记录打印打印的次数
	//2.定义静态成员指针
	static Printer *p;
};
//3.类外进行初始化,new对象
Printer *Printer::p = new Printer;

void test()
{
	//销售部
	Printer *p1 = Printer::getPrinter();
	p1->printPrinter("销售部");

	//技术部
	Printer *p2 = Printer::getPrinter();
	p2->printPrinter("技术部");

	//公关部
	Printer *p3 = Printer::getPrinter();
	p3->printPrinter("公关部");

	Printer *p4 = Printer::getPrinter();
	cout << "打印使用的次数:"<<p4->getCount() << endl;

}

标签:26,Printer,静态,pMaker,模式,单例,getMaker,Maker
From: https://www.cnblogs.com/codemagiciant/p/16746035.html

相关文章

  • 单例模式
    单例分为饿汉式和懒汉式在初始化单例唯一指针的时候,就已经提前开辟好了一个对象,申请了内存。饿汉式的好处是,不会出现线程并发创建,导致多个单例的出现,但是缺点是如果这个......
  • java 前后端开发模式简单说明
    实际上我以前写过一个简单的web前后端部署模式的说明,以下简单说明下关于java语言的,毕竟这个使用人群比较多参考图前后端彻底分离模式(都独立部署)  web使用基于......
  • Redis主从模式的实现
      前面说到了redis在单机的模式下是可以数据持久化的,但是不可以解决单点失败的问题,当单台redis服务器出现问题时,就可能会造成数据的丢失;想要解决这个问题的话我们可以使用......
  • 解释器模式 Interpreter
    “领域规则”模式在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。典型模式Interp......
  • docker版redis-cluster模式集群-主从扩容
    3主3从节点在上篇:docker版redis-cluster模式集群搭建(3主3从)1、新建6387、6388两个节点dockerrun-d--nameredis-node-7--nethost--privileged=true-v/data/......
  • docker版redis-cluster模式集群搭建(3主3从)
    开放端口:开放Redis服务的两个TCP端口。譬如Redis客户端连接端口为6379,而Redis服务在集群中还有一个叫集群总线端口,其端口为客户端连接端口加上10000,即6379+10000=......
  • docker版redis-cluster模式集群-主从缩容
    接上篇扩容:docker版redis-cluster模式集群-主从扩容下线6387和63881、从集群中将4号从节点6388删除,并检查结果redis-cli--clusterdel-nodeip:从机端口从机......
  • NFT数藏盲盒+模式系统开发
    其实NFT未必一定是值钱、一定用来收藏,还有部分场景下,NFT是拿来用的,有自身的使用价值。 NFT20世纪的很长一段时间,体育卡收藏非常流行,但随着卡片供应量的增加,卡片生产商的......
  • 命令模式 Command
    “行为变化”模式在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间......
  • 职责链模式 Chain of Resposibility
    “数据结构”模式常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提......