设计模式之单例模式及应用demo
单例模式是创建型模式之一。
单例模式顾名思义是单例的,也就是只有一个实例化对象,这都来源于它的私有化构造函数。
单例模式特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例
单例模式的应用场景:Windows的Task Manager(任务管理器);网站的计数器; 多线程的线程池的设计; Web应用的配置对象的读取(由于配置文件是共享的资源)。
单例模式的五种实现方法:
在看实现方法之前,要先了解一些java的知识:1、初始化顺序依次是:(静态变量、静态初始化块)–>(普通变量、初始化块)–> 构造器;如果有父类,则顺序是:父类static方法 –> 子类static方法 –> 父类构造方法- -> 子类构造方法 。
2、静态变量特点:static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配,后面根据需要是可以再次赋值的。公共性,就是说,一个类的静态成员,它是属于大伙的,所有的类对象共享的,不像成员变量是自己的。
1、饿汉模式
public class Singleton {
// 私有构造
private Singleton() {}
private static Singleton instance = new Singleton();
// 静态工厂方法,方法没有同步块,所以效率高。
public static Singleton1 getInstance() {
return instance;
}
}
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
2、懒汉模式
public class Singleton {
private static Singleton instance;
private Singleton (){}
//使用的同步锁,降低了效率,但是在多线程可以防止创建多个实例
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
饿汉就是类一旦加载,就把单例初始化完成,保证getInstance的时候,单例是已经存在的了,
而懒汉比较懒,只有当调用getInstance的时候,才回去初始化这个单例。
3、双重检测模式
public class Singleton {
public static volatile Singleton singleton = null;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
synchronize (Singleton.class){
if( singleton == null ) {
singleton = new Singleton();
}
}
return singleton;
}
}
当两个线程执行完第一个 singleton == null 后等待锁, 其中一个线程获得锁并进入synchronize后,实例化了,然后退出释放锁,
另外一个线程获得锁,进入又想实例化,会判断是否进行实例化了,如果存在,就不进行实例化了。
4、静态内部类
public class Singleton {
// 静态内部类LazyHolder
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
此方法既实现了线程安全,又避免了同步带来的性能影响。
还有就是类似的静态代码块实现:
public class Singleton{
// 私有构造
private Singleton() {}
private static Singleton single = null;
// 静态代码块
static{
single = new Singleton();
}
public static Singleton getInstance() {
return single;
}
}
5、枚举类
public class SingletonFactory {
// 内部枚举类
private enum EnmuSingleton{
Singleton;
private Singleton singleton;
//枚举类的构造方法在类加载是被实例化
private EnmuSingleton(){
singleton = new Singleton();
}
public Singleton getInstance(){
return singleton;
}
}
public static Singleton getInstance() {
return EnmuSingleton.Singleton.getInstance();
}
}
class Singleton{
public Singleton(){}
}
下面是一个单例模式使用的demo 饿汉模式
public class TestSingleton {
String name = null;
private TestSingleton() {
}
private static TestSingleton instance = new TestSingleton();
public static TestSingleton getInstance() {
return instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void print() {
System.out.println("the name is " + name);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
TestSingleton ts1 = TestSingleton.getInstance();
ts1.setName("12345");
TestSingleton ts2 = TestSingleton.getInstance();
ts2.setName("56789");
ts1.print();
ts2.print();
if(ts1 == ts2){
System.out.println("创建的是同一个实例");
}else{
System.out.println("创建的不是同一个实例");
}
}
}

设计模式之单例模式及应用demo的更多相关文章
- 设计模式之单例模式的简单demo
/* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 每天一个设计模式-4 单例模式(Singleton)
每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则
加载类可以使用include.require.require_once三种中的任意一种,每个关键字都有两种方法,但是这种方法的缺点是需要加载多少个php文件,就要写多少个加载类的方法.一般也就需要加载 ...
- java 23 - 2 设计模式之单例模式
单例模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? A:把构造方法私有 B:在成员位置自己创建一个对象 C:通过一个公共的方法提供访问 单例模式之饿汉式: (一进来就造对 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
随机推荐
- HSSFWorkbook操作excel读写
//exlel读操作 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Ite ...
- 洛谷P3317 [SDOI2014]重建 [Matrix-Tree定理]
传送门 思路 相信很多人像我一样想直接搞Matrix-Tree定理,而且还过了样例,然后交上去一分没有. 但不管怎样这还是对我们的思路有一定启发的. 用Matrix-Tree定理搞,求出的答案是 \[ ...
- 任意N位二进制的补码实现——队列存放
正在学习计算机组织与结构,为了写一些底层的算术操作模拟,比如一个二进制补码数的加减乘除,发现这很麻烦,因为不管是什么语言,都只提供了8位.32.64位等部分位数的补码形式,那么怎么实现任意任意位的补码 ...
- 安卓易学,爬坑不易—腾讯老司机的RecyclerView局部刷新爬坑之路
前言 安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人.下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程. 话说有图有真 ...
- Confluence 6 当前使用的数据库状态
进入 > 基本配置(General Configuration) > 问题检查和支持工具(Troubleshooting and support tools) 你就可以看到当前使用的数据 ...
- JWT实战
JWT实战 2018年03月02日 22:36:21 阅读数:129 JWT认证流程 先来回顾下JWT的流程,jwt是存储在客户端的,服务器不需要存储jwt;客户端每次发送请求时携带token,然后到 ...
- Jmeter-JDBC Request参数化
一.参数化 1.选择Query Type(查询类型)为Prepared Select Statement 2.写好sql 3.在Parameter Values中输入参数,多个参数用‘,’隔开 4.P ...
- 让simplejson支持datetime类型的序列化
simplejson是Python的一个json包,但是觉得有点不爽,就是不能序列化datetime,稍作修改就可以了: 原文:http://blog.csdn.net/hong201/article ...
- Spring Cloud、Spring Boot与Docker 学习资料汇总
使用Spring Cloud与Docker实战微服务https://gitee.com/itmuch/spring-cloud-bookhttps://eacdy.gitbooks.io/spring ...
- .NET C# 创建WebService服务简单的例子
Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...