边肖将与大家分享单件模式在Java设计模式中的使用。希望大家看完这篇文章后有所收获。我们一起讨论一下吧!
00-1010 singleton模式确保一个类只有一个实例,并提供全局访问点。
定义
Java单件模式
public class singleton {
privatedstationsingletonniqueinstance;//使用静态变量记录Singleton类的唯一实例。
PrivateSingleton(){}//将构造函数声明为private,构造函数只能从Singleton类内部调用。
//用getInstance()方法实例化对象,并返回此实例。
publicationstaticongetinstance(){ 0
if(UniqueInstance==null){ 0
uniqueInstance=newSingleton();
}
返回唯一实例;
}
}上面的代码会在多线程中生成多个实例,所以我们需要对代码进行改进。
经典单件模式的实现
publicclassSingleton{
privatedstationsingletonniqueinstance;
privateSingleton(){}
publicationstaticsynchronizedsongetinstance(){ 0
if(UniqueInstance==null){ 0
uniqueInstance=newSingleton();
}
返回唯一实例;
}
}通过向getInstance()方法添加synchronized关键字,我们强制每个线程在进入方法之前等待其他线程离开该方法。也就是说,没有两个线程可以同时进入这个方法。
多线程单件模式的实现
publicclassSingleton{
//在staticinitializai中创建单例。这样可以保证线程安全。
privatedstationsingletonniqueinstance=newSingleton();
privatedstaticongetinstance(){ 0
返回唯一实例;
}
}一旦JVM加载了这个类,就创建这个唯一的单例实例。JVM保证这个实例必须在任何线程访问uniqueInstance静态变量之前创建。
00-1010将检查该实例是否存在两次,如果不存在则创建一个实例,如果存在则返回。
public class singletonton {
//volatile关键字:当uniqueInstance变量初始化为Singleton实例时,多个线程可以正确处理uniqueInstance变量。
privatevolatilestaticsingletonniqueinstance();
privateSingleton(){}
publicationstaticongetinstance(){ 0
//检查实例,如果不存在,则进入同步块。
if(UniqueInstance==null){ 0
//进入区块后,再次检查。如果仍然为空,将创建实例。
同步的(Singleton . class){ 0
if(UniqueInstance==null){ 0
uniqueInstance=newSingleton();
}
}
}
返回唯一实例;
}
}
急切创建实例
双重检查加锁
Python的模块是自然的单件模式。第一次导入模块时,会生成一个. pyc文件。当以后再次导入时,以前生成的。pyc文件将被直接加载,模块代码不会再次执行。
/>先创建一个Singleton文件
class Singleton: def getSingleton: pass singleton = Singleton()
在其他文件中导入这个模块,这个类的地址是唯一的
new关键字实现
当实例化一个对象时,先调用类的__new__方法 ,默认调用的是父类Object.__new__方法,实例化对象。然后再调用类的__init__方法进行属性的初始化。
我们可以再__new__方法内加一个判断,若实例存在,则不实例化,若不存在,则实例化。
class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = object.__new__(cls, *args, **kwargs) return cls._instance def __init__(self): pass
装饰器实现
通过装饰器来实现单件模式
函数装饰器
def singleton(cls): # 创建一个私有变量,类型为字典,用来存放类地址的 _instance = {} def inner(): # 如果类不存在 if cls not in _instance: # 实例化一个类并存放在字典里 _instance[cls] = cls() return _instance[cls] return inner @singleton class ClassName(object): def __init__(self): pass
类装饰器
class Singleton(object): def __init__(self, cls): self._cls = cls # 接受类名 self._instance = {} # 存放类地址 def __call__(self): if self._cls not in self._instance: # 实例化类并存放在字典内 self._instance[self._cls] = self._cls() return self._instance[self._cls] @Singleton class ClassName(object): def __init__(self): pass
看完了这篇文章,相信你对“Java设计模式中单件模式有什么用”有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/89357.html