Java 单列模式(Singleton)
单例模式(Singleton)
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
目的:使得类的一个对象成为系统中的唯一实例。
如何保证一个类只有一个实例并且这个实例易于被访问呢?
我们都知道,一个类多次被new 创建后,获取的是不同实例。
创建一个类
public class NewObject { } 测试
public class NewOne {
public static void main(String[] args) { NewObject no1= new NewObject();
NewObject no2= new NewObject(); System.out.println("no1--->"+no1);
System.out.println("no2--->"+no2);
}
}
控制台输出的是:
由此可知:要想产生单个实例就得:让类自身负责保存它的唯一实例,这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。
- 单例模式的类只提供私有的构造函数
- 类定义中含有一个该类的静态私有对象
- 提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象
一般Singleton有是三种模式:懒汉式(最常用)、饿汉式、 双重锁
懒汉式:
public class Singleton {
/*
* 懒汉式单例:只有在第一次请求实例的时候创建,并且只在第一次创建后,以后不再创建该类的实例
*/ // 1.一个私有的指向自己的静态变量
private static Singleton instance; // 2.私有的构造方法,保证不能从外部创建对象
private Singleton(){} // 3.公开的静态工厂方法,返回该类的唯一实例(当发现没有实例没有初始化的时候才初始化)
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
System.out.println("创建Singleton类的实例");
}else {
System.out.println("实例已经创建,不能再创建");
}
return instance;
} }
public class Test { public static void main(String[] args) {
Singleton s = Singleton.getInstance();
System.out.println("第一次---->"+s);
System.out.println("第二次---->"+Singleton.getInstance());
System.out.println("第三次---->"+Singleton.getInstance());
}
}
饿汉式:
public class Singleton2 {
/*
* 恶汉单例模式:在类加载的时候就创建一个单例模式.
*/ // 1.私有的构造函数,确保不能在类的外部访问该类的构造函数
private Singleton2(){
System.out.println("构造函数执行了");
} // 2.私有的唯一的静态实例变量,在类加载的时候就创建好单例对象
private final static Singleton2 instance = new Singleton2(); // 3.公开的静态工厂返回此类的唯一实例
public static Singleton2 getInstance(){
return instance;
}
}
public class Test { public static void main(String[] args) { Singleton2 s1 = Singleton2.getInstance();
System.out.println(s1);
System.out.println(Singleton2.getInstance());
System.out.println(Singleton2.getInstance());
}
}
双重锁
package com.单列模式; public class Singleton3 { private static Singleton3 instance=null;
private Singleton3(){
System.out.println("构造函数开始!");
}
public static synchronized Singleton3 getInstance(){
if(instance==null){
synchronized(Singleton3.class){
if(instance==null){
instance=new Singleton3();
}
}
}
return instance;
}
}
public class Test { public static void main(String[] args) { Singleton3 s3 =Singleton3.getInstance();
System.out.println(s3);
System.out.println(Singleton3.getInstance());
System.out.println(Singleton3.getInstance());
}
}
谢谢大家的关注。小弟才疏学浅,更新的很慢,但我会把自己学的倾囊相授。人生两大悲剧:一是万念俱灰,一是踌躇满志。
Java 单列模式(Singleton)的更多相关文章
- Java单列模式
设计模式 单列模式的定义和作用 目的:使得类的一个对象成为该类系统中的唯一实列: 定义:一个类有且仅有一个实例,并且自行实列化向整个系统提供?: 单列模式分为 恶汉式 (在创建对象的时候就直接初始化 ...
- 单列模式 (singleton pattern)
单列就是说一个类只能被实例化一次,重点是确保某个对象只有一个,不会有第2个. c# 的实现是这样的 代码来源 : http://www.cnblogs.com/zhili/p/3185302.html ...
- java基础语法(二)--单列模式
java基础语法(二)--单列模式 /** * 功能:单列模式 * @author Administrator * */ public class SingletonTest { public sta ...
- java基础(三):反射、反序列化破解单列模式和解决方式
单例模式指的是一个类只有一个对象,通过一些措施达到达到这个目的.但是反射和反序列化可以获得多个不同的对象. 先简单的认识一下单例模式 一:单例模式 通过私有构造器,声明一个该类的静态对象成员,提供一个 ...
- 在JAVA和android中常用的单列模式
在很多开发中,项目为了节约资源,都把一个类的构造函数变为私有化,这样整个项目中就不能创建多个实例,这样的方法我们称为单例模式 现在通过代码来简介下这个单例模式: 在新建一个java项目后,创建一个实体 ...
- 23种设计模式学习一(单列模式)singleton
单列模式的类(单线程下的) class Singleton { private static Singleton instance; private Singleton() { } public st ...
- java设计模式--单列模式
java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...
- 面试:用 Java 实现一个 Singleton 模式
面试:用 Java 实现一个 Singleton 模式 面试系列更新后,终于迎来了我们的第一期,我们也将贴近<剑指 Offer>的题目给大家带来 Java 的讲解,个人还是非常推荐< ...
- 《JAVA与模式》之单例模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述单例模式的: 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的 ...
随机推荐
- java时间类型的转换/获取当前时间/将时间转换成String/将String转换成时间
对于我的脑子,我已经服气了...写了N遍的东西,就是记不住...既然记不住那就记下来... 利用java获取当前的时间(String类型,年-月-日 时:分:秒) //我要获取当前的日期 Date d ...
- ireport5.6+jasperreport6.3开发(二)--web开发的配置
ireport5.6只能编译出*.jasper的报表包,最终报表需要被输出为一个doc html pdf excel等文件,这时就需要jasperreport6.5的库进行配合了. jasperrep ...
- python+selenium安装步骤
1.先安装python 2.下载setuptools 使用方法是在 命令提示符(cmd)下 输入 "easy_install包名称" 3.安装pip 4.安装selenium如果是 ...
- IE订阅博客
思来想去,qq邮箱订阅似乎也不是很方便,尝试了下,点击“博客”中的“订阅”,博客竟然被ie订阅了,据介绍,博客中有更新,即时IE不打开,也会看到信息,这不,我来尝试了,RSS真是不试不知道,一试真方便 ...
- MVC5+EF6 入门完整教程十
本篇是第一阶段的完结篇. 学完这篇后,你应该可以利用MVC进行完整项目的开发了. 本篇主要讲述多表关联数据的更新,以及如何使用原生SQL. 文章提纲 多表关联数据更新 如何使用原生SQL 总结 多表关 ...
- Windows Store App Image开发示例
通过上面的介绍,读者已经了解了Image对象及ImageBrush对象的使用方法和常用属性,在实际的开发工作中,比较常用的是Image对象,下面以一个幼儿园识物识字卡应用为例,来帮助读者更好的理解Im ...
- Orchard入门:如何创建一个完整Module
这是一个Orchard-Modules的入门教程.在这个教程里,我们将开发两个功能页面分别用于数据录入与数据展示. 完成上述简单功能开发,我们一共需要6个步骤.分别为: 创建Module 创建Mode ...
- MySql创建树结构递归查询存储过程
在实现F2工作流底层多数据库支持时发现Oracel和mssql都有提供递归子查询,而MySql却没有,没办法需要自己构建存储过程来提供这个递归子查询的功能. -- 当前节点及子节点 -- 参数说明:i ...
- 繁星——jquery的data()方法
今天在看JQuery文档的时候偶然看到了data()方法,觉得挺好用的,这里做个记录. 这个方法用于在元素上存放数据,返回jQuery对象.在文档中提到V1.4.3 新增用法NEW data(obj) ...
- Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project LogTest: Compilation failure -> [Help 1]
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default ...