博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
04单例模式Singleton
阅读量:6122 次
发布时间:2019-06-21

本文共 2887 字,大约阅读时间需要 9 分钟。

一、什么是单例模式

  单例模式是一种对象创建型模式,使用单例模式, 可以保证为一个类只生成唯一的实例对象。也就是说, 在整个程序空间中,该类只存在一个实例对象。

   其实,GoF对单例模式的定义是:保证一个类、 只有一个实例存在,同时提供能对该实例加以访 问的全局访问方法。

 

二、为什么要使用单例模式呢?

  在应用系统开发中,我们常常有以下需求:

    - 在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象

    - 在整个程序空间使用全局变量,共享资源

    - 大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

  因为Singleton模式可以保证为一个类只生成唯一的实例 对象,所以这些情况,Singleton模式就派上用场了。

 

三、单例模式实现

  1.饿汉式。 2.懒汉式。 3.双重检查。

饿汉式

1 //饿汉式 2 public class Person { 3     public static final Person person = new Person(); 4     private String name; 5      6      7     public String getName() { 8         return name; 9     }10 11     public void setName(String name) {12         this.name = name;13     }14     15     //构造函数私有化16     private Person() {17     }18     19     //提供一个全局的静态方法20     public static Person getPerson() {21         return person;22     }23 }

懒汉式

1 //懒汉式 2 public class Person2 { 3     private String name; 4     private static Person2 person; 5      6     public String getName() { 7         return name; 8     } 9 10     public void setName(String name) {11         this.name = name;12     }13     14     //构造函数私有化15     private Person2() {16     }17     18     //提供一个全局的静态方法19     public static Person2 getPerson() {20         if(person == null) {21             person = new Person2();22         }23         return person;24     }25 }

懒汉式同步

1 //懒汉式,使用同步方法synchronized 2 public class Person3 { 3     private String name; 4     private static Person3 person; 5      6     public String getName() { 7         return name; 8     } 9 10     public void setName(String name) {11         this.name = name;12     }13     14     //构造函数私有化15     private Person3() {16     }17     18     //提供一个全局的静态方法,使用同步方法19     public static synchronized Person3 getPerson() {20         if(person == null) {21             person = new Person3();22         }23         return person;24     }25 }

双重检查

1 //双重检查 2 public class Person4 { 3     private String name; 4     private static Person4 person; 5      6     public String getName() { 7         return name; 8     } 9 10     public void setName(String name) {11         this.name = name;12     }13     14     //构造函数私有化15     private Person4() {16     }17     18     //提供一个全局的静态方法19     public static Person4 getPerson() {20         if(person == null) {21             synchronized (Person4.class) {22                 if(person == null) {23                     person = new Person4();24                 }25             }26             27         }28         return person;29     }30 }

测试方法

1 public class MainClass { 2     public static void main(String[] args) { 3         Person2 per = Person2.getPerson(); 4         Person2 per2 = Person2.getPerson(); 5         per.setName("zhangsan"); 6         per2.setName("lisi"); 7          8         System.out.println(per.getName()); 9         System.out.println(per2.getName());10     }11 }

 

转载于:https://www.cnblogs.com/justdoitba/p/9031887.html

你可能感兴趣的文章
商品单位关系与删除缺货登记
查看>>
logger 配置文件详解
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
重复执行命令的脚本
查看>>
nginx 允许跨域
查看>>
Ubuntu apt-get update失败
查看>>
pfSense版本分类
查看>>
Objective-C-NSOperation
查看>>
Storm【错误诊断】 - Storm-kafka 提交到集群
查看>>
仿Jquery
查看>>
Linux下MySQL5.6.15-忘记root密码或者在mininal上装5.6之后,怎么初始化mysql
查看>>
主域控辅助域控的搭建以及主域控制器的迁移
查看>>
trancing in erlang
查看>>
Windows Phone 8 Nokia地图控件
查看>>
我的友情链接
查看>>
Mysql存储过程中使用cursor
查看>>
从一个
查看>>
MongoDB 第三周作业——用java操作MongoDB之删除数组中的元素
查看>>
三、基于802.1x+AD+NPS+DHCP动态下发VLAN配置 (第3篇、添加角色NPS并设置)
查看>>
Windows开启SNMP服务----Win7
查看>>