一、什么是单例模式

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

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

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

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

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

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

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

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

三、单例模式实现

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

饿汉式

 //饿汉式
public class Person {
public static final Person person = new Person();
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} //构造函数私有化
private Person() {
} //提供一个全局的静态方法
public static Person getPerson() {
return person;
}
}

懒汉式

 //懒汉式
public class Person2 {
private String name;
private static Person2 person; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} //构造函数私有化
private Person2() {
} //提供一个全局的静态方法
public static Person2 getPerson() {
if(person == null) {
person = new Person2();
}
return person;
}
}

懒汉式同步

 //懒汉式,使用同步方法synchronized
public class Person3 {
private String name;
private static Person3 person; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} //构造函数私有化
private Person3() {
} //提供一个全局的静态方法,使用同步方法
public static synchronized Person3 getPerson() {
if(person == null) {
person = new Person3();
}
return person;
}
}

双重检查

 //双重检查
public class Person4 {
private String name;
private static Person4 person; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} //构造函数私有化
private Person4() {
} //提供一个全局的静态方法
public static Person4 getPerson() {
if(person == null) {
synchronized (Person4.class) {
if(person == null) {
person = new Person4();
}
} }
return person;
}
}

测试方法

 public class MainClass {
public static void main(String[] args) {
Person2 per = Person2.getPerson();
Person2 per2 = Person2.getPerson();
per.setName("zhangsan");
per2.setName("lisi"); System.out.println(per.getName());
System.out.println(per2.getName());
}
}

04单例模式Singleton的更多相关文章

  1. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  2. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  3. ooad单例模式-Singleton

                                                单例模式Singleton 主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 比如建立目录 ...

  4. iOS单例模式(Singleton)写法简析

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...

  5. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  6. 设计模式之——单例模式(Singleton)的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  7. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  8. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  9. IOS单例模式(Singleton)

    IOS单例模式(Singleton)   单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...

随机推荐

  1. C# try catch finally简单介绍和应用

    今天看代码书的时候,有用到try--catch--finally,然后就查了下具体的注意事项和应用. 简单来说就是: try { //有可能出错误的代码或者代码片段       } catch{ // ...

  2. web开发必备的浏览器常识

    浏览器内核: 1.使用Trident内核的浏览器:IE.Maxthon.TT.The World等: 2.使用Gecko内核的浏览器:Netcape6及以上版本.FireFox.MozillaSuit ...

  3. PHP Redis 对象方法手册

    redis(Remote Dictionary Server)是一种Nosql技术,它是一个开源的高级kv存储和数据结构存储系统. redis不仅仅是能够存储key和value这种简单的键值对,还能存 ...

  4. spring cloud: 使用consul来替换eureka

    eureka官方已经正式宣布:自2.0起不再维护该项目,并在github 项目wiki上放出了一段吓唬人的话: 大意就是:从2.x起,官方不会继续开发了,如果需要使用2.x,风险自负.但其实我觉得问题 ...

  5. grep/pgrep/egrep/fgrep

    Differences between grep, pgrep, egrep, and fgrep (Linux): grep grep is an acronym that stands for & ...

  6. 学习shader之前必须知道的东西之计算机图形学-渲染管线

    引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...

  7. Array and Linkedlist区别与操作的时间复杂度(转载)

    转载自:http://blog.csdn.net/tm_wb/article/details/6319146 数组链表堆栈和队列 数组链表堆栈和队列是最基本的数据结构,任何程序都会涉及到其中的一种或多 ...

  8. Notes中几个处理多值域的通用函数

    1.查找出查找内容在多值域中的索引值 getItemIndex(域名,域值,文档) Public Function getItemIndex(ByVal fieldName As String, By ...

  9. 关于ř与tableau的集成---- k均值聚类

    1.利用R内置数据集iris: 2.通过Rserve 包连接tableau,服务器:localhost,默认端口6311: 3.加载数据集iris: 4.编辑字段:Cluster <span s ...

  10. MySQL binlog_format (Mixed,Statement,Row)[转]

    MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式日志的优缺点. MySQL ...