python单例类命名_单例模式(java/python/c++)
序
最近接触到新项目,后端基于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++)相关推荐
- python 单例类
1.创建单例类 class CCP(object):def __new__(cls,*args,**kwargs):if not hasattr(cls,'_instance'): # 如果类对象中没 ...
- java 单例 生命周期_单例模式--- 声明周期托管方式
声明周期托管方式,IOC JAVA代码 MyManager.java import java.util.HashMap; /** * 为了管理对象的产生 * 对象的控制权给当前类负责 * 生命周期托管 ...
- python 复制文件并重命名_好书推荐 | Python 如此神奇,让繁琐工作自动化
优质文章,第一时间送达! Python 如此神奇,让繁琐工作自动化 编程的威力 如今,人们面临的大多数任务都可以通过编写计算机软件来完成. Al Sweigart 的室友曾经只花了几个小时,就写出了一 ...
- python中exception类的_什么是Python异常?Python异常的种类
程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)#语法错误示范一 if #语法错误示范二 def test: pass 2. ...
- python中扑克牌类设计_一摞Python风格的纸牌
一摞Python风格的纸牌 接下来我会用一个非常简单的例子来展示如何实现 getitme 和 len 这两个特殊方法,通过这个例子我们也能见识到特殊方法的强 大. 示例 1-1 里的代码建立了一个纸牌 ...
- python 单链表查找元素_如何在python中一次找到链表的中间元素?
我合并了所有的方法,为您创建,查找和打印.class Node(object): def __init__(self, data=None, next=None): self.data = data ...
- java中单例设计模式登记式单例类_java23种设计模式-创建型模式之单例模式
单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...
- 单例模式(Python中的单例类)
目录 一.单例模式的概述 二.单例模式的优缺点 三.在Python中,单例模式有以下几种实现方式 1.通过魔法方法__new__实现 2.通过模块的导入 3.通过装饰器实现 4.通过使用类实现 一.单 ...
- java 防止反射_如何防止JAVA反射对单例类的攻击?
在我的上篇随笔中,我们知道了创建单例类有以下几种方式: (1).饿汉式; (2).懒汉式(.加同步锁的懒汉式.加双重校验锁的懒汉式.防止指令重排优化的懒汉式); (3).登记式单例模式; (4).静态 ...
最新文章
- 【数据结构】链式队列的实现(C语言)
- Nginx SSI 设置
- C# 操作 Word 修改word的高级属性中的自定义属性
- 苹果13系统锁屏延迟_iPhone 11 锁屏出现延迟是怎么回事?
- 【转】HTTP协议中PUT和POST使用区别
- 区分 JSON 字符串与JSON对象
- Python面试准备
- csv数据源的创建(二)
- 使用Perl实现系统管理自动化(第二版) 中文电子版
- SDK Manager配置
- 服务器搬迁方案_医院机房迁移细则规范 amp; 机房搬迁实施规划方案
- 迅雷网速测试器 - 下载速率测试记录
- SiteMesh3简介及使用
- Dev-Cpp下载及使用教程
- 问卷与量表数据分析(SPSS+AMOS)学习笔记(六) : SPSS 描述性统计分析
- STM32入门教程第一讲
- 数据结构实验三 线性表的链式存储结构及实现
- 金惟纯《人生只有一件事》读书笔记
- Android虚拟机的安装
- 绝对高效实现! 给你一个包含n个整数的数组nums,判断nums是否存在三个元素a,b,c使得a+b+c =0...
热门文章
- 如何在 Linux 虚拟机上扩展根文件系统
- 记录 McAfee WebAdvisor 产生大量日志文件,卸载时一直转圈圈,成功卸载方式
- Java集合 LinkedList的原理及使用
- stm32搭建mqtt_STM32+ESP8266+AIR202基本控制篇-102-服务器基本搭建-安装MQTT软件(.Windows系统)...
- 《剑指offer》——04. 二维数组中的查找——暴力法、线性查找——java实现
- pycharm python3区别_1.安装Python3和PyCharm
- 编译实验(一)词法分析
- 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
- clientdataset 遍历字段_TClientDataSet[5]: 读取数据
- linux 控制网卡流量,如何管理和控制多网卡 Linux 虚拟机的流量走向