当前位置: 首页 > news >正文

Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

单件模式确保一个类只有一个实例,并提供一个全局访问点。

确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程的问题。


代码链接:点击打开链接


单件模式类图


源代码:

 

#ifndef CHOCOLATEBOILER_H
#define CHOCOLATEBOILER_H

#include<iostream>

class ChocolateBoiler
{
    private:
        ChocolateBoiler()
        {
            empty = true;
            boiled = false;
        }
        ~ChocolateBoiler()
        {
            uniqueInstance = 0;
        }
        ChocolateBoiler( const ChocolateBoiler& );
        void operator=( const ChocolateBoiler& );
    public:
        static ChocolateBoiler * getInstance()
        {
            if(uniqueInstance==0)
            {
                std::cout << "Creating unique instance of Chocolate Boiler" << std::endl;
                uniqueInstance = new ChocolateBoiler();
            }
            std::cout << "Returning instance of Chocolate Boiler"<< std::endl;
            return uniqueInstance;
        }
        void fill()
        {
            if(isEmpty())
            {
                empty = false;
                boiled =false;
            }
        }

        void drain()
        {
            if(!isEmpty() && isBoiled())
            {
                empty = true;
            }
        }

        void boil()
        {
            if(!isEmpty() && !isBoiled())
            {
                boiled = true;
            }
        }
        bool isEmpty()
        {
            return empty;
        }

        bool isBoiled()
        {
            return boiled;
        }
    protected:
    private:
        bool empty;
        bool boiled;
        static ChocolateBoiler* uniqueInstance;
};

#endif // CHOCOLATEBOILER_H


测试代码:

 

 

#include "ChocolateBoiler.h"

ChocolateBoiler* ChocolateBoiler::uniqueInstance = 0;
int main()
{
    ChocolateBoiler* boiler = ChocolateBoiler::getInstance();
    boiler->fill();
    boiler->boil();
    boiler->drain();

    ChocolateBoiler *boiler2= ChocolateBoiler::getInstance();
    if(boiler == boiler2)
        std::cout<<"Got same boiler"<<std::endl;
    else
        std::cout<<"Got different boler"<<std::endl;

    return 0;
}


 

测试结果如下:


原创转载注明出处

 

相关文章:

  • 又一编辑神器-百度编辑器-Ueditor
  • SQL Server与MySQL之间的切换
  • window7如何提高到最高权限
  • [译]理解HEAD请求以及HTTP/204和HTTP/206响应
  • 第1讲:软件测试背景
  • 我要洗发液 洗衣粉 肥皂 威露士
  • 安装并配置OCEE
  • Linux下安装Oracle11g服务器
  • 用Java创建数组工具类ArrayTool
  • 解决实体类噩梦:联合实体类(Java反射+泛型实际应用)
  • proxool数据连接池
  • pdns和powreadmin的安装
  • Jira:必选项设置(创建缺陷、修复缺陷)
  • 如何解读数码相机的直方图
  • CSS3实现的3D按钮精美效果
  • [PHP内核探索]PHP中的哈希表
  • echarts花样作死的坑
  • ECMAScript入门(七)--Module语法
  • JavaScript的使用你知道几种?(上)
  • JavaScript设计模式与开发实践系列之策略模式
  • javascript数组去重/查找/插入/删除
  • Less 日常用法
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • vue-loader 源码解析系列之 selector
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 前端攻城师
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何设计一个比特币钱包服务
  • 详解NodeJs流之一
  • 消息队列系列二(IOT中消息队列的应用)
  • 【云吞铺子】性能抖动剖析(二)
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • "无招胜有招"nbsp;史上最全的互…
  • #考研#计算机文化知识1(局域网及网络互联)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (待修改)PyG安装步骤
  • (三)elasticsearch 源码之启动流程分析
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)负载均衡,回话保持,cookie
  • .NET Framework 4.6.2改进了WPF和安全性
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .Net Remoting(分离服务程序实现) - Part.3
  • .Net中间语言BeforeFieldInit
  • @Pointcut 使用
  • [ 蓝桥杯Web真题 ]-布局切换
  • [2023年]-hadoop面试真题(一)
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [codevs 1515]跳 【解题报告】
  • [emuch.net]MatrixComputations(7-12)
  • [go 反射] 进阶
  • [HNOI2008]Cards
  • [Nginx]反向代理Node将3000端口访问转换成80端口