最近接触到新项目,后端基于java开发。对于有c++/python开发经验,无java经验的小梅同学,开始了漫漫学习之旅,第一篇学习记录,从最简单的单例模式开始吧。

众所周知,单例模式的最明显的几个特点:

一个进程存在唯一一个实例

不能被用户创建

有一个获取实例的接口

单例模式常用在日志,全局变量等整个进程只需要唯一实例的应用中。

开启java之旅

Step1:new->Package 命名为singleton

Step2:在singleton包下,new->Java Class,命名为Singleton。Singleton.java实现如下:

package singleton;

public class Singleton

{

// 定义一个私有静态的句柄

private static Singleton instance = null;

// 构造函数私有化:保证1,2

private Singleton(){}

// 公有静态获取句柄函数:保证3

public static Singleton getInstance()

{

if(instance == null)

{

instance = new Singleton();

}

return instance;

}

// 其他普通函数

public void testCommFunc()

{

System.out.println("Common Function Of Singleton Class");

}

};

Step3:在singleton包下,new->Java Class,命名为SingletonDemo。SingletonDemo.java实现如下:

package singleton;public class SingletonDemo

{

public static void main(String[] args)

{

Singleton s = Singleton.getInstance();

s.testCommFunc();

}

}

Step4: 运行SingletonDemo.java,控制台输出:

Common Function Of Singleton Class

回顾

Python中单例

最简单的方式:在file1.py定义中定义一个变量var,其他文件导入这个变量,此变量即是全局的。如果此变量为类实例变量,那么此实例即是唯一的。

单例class方式:

# 单例实现

class Singleton(type):

def __call__(cls, *args, **kwargs):

if not hasattr(cls, "_instance"):

# with Singleton.lock: #如果是多线程的话,此处需要加锁

if not hasattr(cls, "_instance"):

cls._instance = super(Singleton, cls).__call__(*args, **kwargs)

return cls._instance

# ClassA(比如日志类)继承单例

class MyLog(metaclass=Singleton):

def __init__(self):

super(ClassA, self).__init__()

self.x = None

self.y = dict()

a1 = MyLog()

a1.x = 10

a2 = MyLog()

a2.y = [1, 1, 2]

# a1和a2的输出地址应相同

print("addr a1 {} a2 {}".format(a1, a2))

# a1和a2的x,y值应相同,分别为10, [1, 1, 2]

print("x: a1 {}, a2 {}".format(a1.x, a2.x))

print("y: a1 {}, a2 {}".format(a1.y, a2.y))

c++中的单例

template

class TSingleton

{

public:

static T* getInstance();

protected:

TSingleton(const TSingleton&) {}

TSingleton&operator=(const TSingleton&) {}

TSingleton() {}

virtual ~TSingleton() {}

static std::shared_ptr&instance()

{

// 采用std标准库中的轻量级智能指针实现单件对象管理

static std::shared_ptr pInstance;

return pInstance;

}

};

template

T*TSingleton::getInstance()

{

std::shared_ptr &rInstance = instance();

// Double-checked

if (NULL == rInstance.get())

{

if (NULL == rInstance.get())

{

// 不使用instance().reset(new T),防止在编译器优化的情况下

// 出现先将智能指针赋值,再进行构造

std::shared_ptr _au(new T);

rInstance = _au;

}

}

return rInstance.get();

}

日志类:

class CMyLog : public TSingleton

{

....

}

python单例类命名_单例模式(java/python/c++)相关推荐

  1. python 单例类

    1.创建单例类 class CCP(object):def __new__(cls,*args,**kwargs):if not hasattr(cls,'_instance'): # 如果类对象中没 ...

  2. java 单例 生命周期_单例模式--- 声明周期托管方式

    声明周期托管方式,IOC JAVA代码 MyManager.java import java.util.HashMap; /** * 为了管理对象的产生 * 对象的控制权给当前类负责 * 生命周期托管 ...

  3. python 复制文件并重命名_好书推荐 | Python 如此神奇,让繁琐工作自动化

    优质文章,第一时间送达! Python 如此神奇,让繁琐工作自动化 编程的威力 如今,人们面临的大多数任务都可以通过编写计算机软件来完成. Al Sweigart 的室友曾经只花了几个小时,就写出了一 ...

  4. python中exception类的_什么是Python异常?Python异常的种类

    程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)#语法错误示范一 if #语法错误示范二 def test: pass 2. ...

  5. python中扑克牌类设计_一摞Python风格的纸牌

    一摞Python风格的纸牌 接下来我会用一个非常简单的例子来展示如何实现 getitme 和 len 这两个特殊方法,通过这个例子我们也能见识到特殊方法的强 大. 示例 1-1 里的代码建立了一个纸牌 ...

  6. python 单链表查找元素_如何在python中一次找到链表的中间元素?

    我合并了所有的方法,为您创建,查找和打印.class Node(object): def __init__(self, data=None, next=None): self.data = data ...

  7. java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式

    单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  8. 单例模式(Python中的单例类)

    目录 一.单例模式的概述 二.单例模式的优缺点 三.在Python中,单例模式有以下几种实现方式 1.通过魔法方法__new__实现 2.通过模块的导入 3.通过装饰器实现 4.通过使用类实现 一.单 ...

  9. java 防止反射_如何防止JAVA反射对单例类的攻击?

    在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...

最新文章

  1. 【数据结构】链式队列的实现(C语言)
  2. Nginx SSI 设置
  3. C# 操作 Word 修改word的高级属性中的自定义属性
  4. 苹果13系统锁屏延迟_iPhone 11 锁屏出现延迟是怎么回事?
  5. 【转】HTTP协议中PUT和POST使用区别
  6. 区分 JSON 字符串与JSON对象
  7. Python面试准备
  8. csv数据源的创建(二)
  9. 使用Perl实现系统管理自动化(第二版) 中文电子版
  10. SDK Manager配置
  11. 服务器搬迁方案_医院机房迁移细则规范 amp; 机房搬迁实施规划方案
  12. 迅雷网速测试器 - 下载速率测试记录
  13. SiteMesh3简介及使用
  14. Dev-Cpp下载及使用教程
  15. 问卷与量表数据分析(SPSS+AMOS)学习笔记(六) : SPSS 描述性统计分析
  16. STM32入门教程第一讲
  17. 数据结构实验三 线性表的链式存储结构及实现
  18. 金惟纯《人生只有一件事》读书笔记
  19. Android虚拟机的安装
  20. 绝对高效实现! 给你一个包含n个整数的数组nums,判断nums是否存在三个元素a,b,c使得a+b+c =0...

热门文章

  1. 如何在 Linux 虚拟机上扩展根文件系统
  2. 记录 McAfee WebAdvisor 产生大量日志文件,卸载时一直转圈圈,成功卸载方式
  3. Java集合 LinkedList的原理及使用
  4. stm32搭建mqtt_STM32+ESP8266+AIR202基本控制篇-102-服务器基本搭建-安装MQTT软件(.Windows系统)...
  5. 《剑指offer》——04. 二维数组中的查找——暴力法、线性查找——java实现
  6. pycharm python3区别_1.安装Python3和PyCharm
  7. 编译实验(一)词法分析
  8. 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
  9. clientdataset 遍历字段_TClientDataSet[5]: 读取数据
  10. linux 控制网卡流量,如何管理和控制多网卡 Linux 虚拟机的流量走向