经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java设计模式之单件模式深入讲解
来源:jb51  时间:2021/11/8 19:51:56  对本文有异议

定义

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

Java单件模式

经典单件模式的实现

  1. public class Singleton{
  2. private static Singleton uniqueInstance; // 利用一个静态变量来记录Singleton类的唯一实例
  3. private Singleton(){} // 把构造器声明为私有的,只有自Singleton类内才可以调用构造器
  4. // 用getInstance()方法实例化对象,并返回这个实例
  5. public static Singleton getInstance(){
  6. if (uniqueInstance == null){
  7. uniqueInstance = new Singleton();
  8. }
  9. return uniqueInstance;
  10. }
  11. }

在多线程中以上代码会生成多个实例,所以需要我们对代码进行改进

多线程单件模式的实现

  1. public class Singleton{
  2. private static Singleton uniqueInstance;
  3.  
  4. private Singleton(){}
  5.  
  6. public static synchronized Singleton getInstance(){
  7. if(uniqueInstance == null){
  8. uniqueInstance = new Singleton();
  9. }
  10. return uniqueInstance;
  11. }
  12. }

通过增加synchronized关键字到getInstance()方法中,我们迫使每个线程在进入这个方法之前,要先等候别的线程离开该方法。也就是说,不会有两个线程可以同时进入这个方法。

急切创建实例

  1. public class Singleton{
  2. // 在静态初始化器(static initializai)中创建单件。这样可以保证线程安全(thread sate)
  3. private static Singleton uniqueInstance = new Singleton();
  4.  
  5. private static Singleton getInstance(){
  6. return uniqueInstance;
  7. }
  8. }

在JVM在加载这个类时马上创建此唯一的单件实例。JVM保证在任何线程访问uniqueInstance静态变量之前,一定创建此实例。

双重检查加锁

会有两次检查实例是否存在,若不存在则创建实例,若存在则返回

  1. public class Singlenton{
  2. // volatile关键词:当uniqueInstance变量被初始化成Singleton实例时,多个线程正确地处理uniqueInstance变量
  3. private volatile static Singleton uniqueInstance();
  4. private Singleton(){}
  5.  
  6. public static Singleton getInstance(){
  7. // 检查实例,如果不存在,就进入同步区块
  8. if(uniqueInstance == null){
  9. // 进入区块后,再检查一次。如果仍是null,才创建实例
  10. synchronized (Singleton.class){
  11. if(uniqueInstance == null){
  12. uniqueInstance = new Singleton();
  13. }
  14. }
  15. }
  16. return uniqueInstance;
  17. }
  18. }

Python单件模式

模块实现

Python 的模块就是天然的单件模式,在模块第一次被导入时,会生成.pyc文件,之后再次导入时,就会直接加载之前生成的.pyc文件,不会再次执行模块代码
先创建一个Singleton文件

  1. class Singleton:
  2. def getSingleton:
  3. pass
  4. singleton = Singleton()

在其他文件中导入这个模块,这个类的地址是唯一的

new关键字实现

当实例化一个对象时,先调用类的__new__方法 ,默认调用的是父类Object.__new__方法,实例化对象。然后再调用类的__init__方法进行属性的初始化。
我们可以再__new__方法内加一个判断,若实例存在,则不实例化,若不存在,则实例化。

  1. class Singleton(object):
  2. _instance = None
  3. def __new__(cls, *args, **kwargs):
  4. if cls._instance is None:
  5. cls._instance = object.__new__(cls, *args, **kwargs)
  6. return cls._instance
  7. def __init__(self):
  8. pass
  9.  

装饰器实现

通过装饰器来实现单件模式

函数装饰器

  1. def singleton(cls):
  2. # 创建一个私有变量,类型为字典,用来存放类地址的
  3. _instance = {}
  4.  
  5. def inner():
  6. # 如果类不存在
  7. if cls not in _instance:
  8. # 实例化一个类并存放在字典里
  9. _instance[cls] = cls()
  10. return _instance[cls]
  11. return inner
  12. @singleton
  13. class ClassName(object):
  14. def __init__(self):
  15. pass
  16.  

类装饰器

  1. class Singleton(object):
  2. def __init__(self, cls):
  3. self._cls = cls # 接受类名
  4. self._instance = {} # 存放类地址
  5. def __call__(self):
  6. if self._cls not in self._instance:
  7. # 实例化类并存放在字典内
  8. self._instance[self._cls] = self._cls()
  9. return self._instance[self._cls]
  10.  
  11. @Singleton
  12. class ClassName(object):
  13. def __init__(self):
  14. pass
  15.  

以上就是Java设计模式之单件模式深入讲解的详细内容,更多关于Java设计模式的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号