文档章节

Header First设计模式学习笔记——单例模式

 梦回雪夜观花
发布于 2014/05/25 23:54
字数 643
阅读 135
收藏 3

问题引入

        有时候对于有些对象,我们只需要一个,多了反而会出现很多问题。比如:线程池,缓存,处理器偏好设置,日志对象等等(可能导致程序异常,内存泄露)。

模式定义

        确保一个类只有一个实例,并提供一个全局访问点。

认识模式

        确实我们可以通过程序员之间的约定保证一个类只有一个对象,但是通过使用单例模式效果更好,更安全。

问题解决

       创建单例模式类步骤:   

         * 1、构造一个私有的静态变量;

         * 2、构造函数私有化,避免外部直接创建对象;

         * 3、创建一个公有的静态方法,返回该变量,如果该变量为空,创建该对象。

直接上代码:

package my.oschina.net.design.singleton;

class SingleTon
{
	private static SingleTon instance = null;
	
	private SingleTon(){}

	public static SingleTon getInsatnce()
	{	
		if(null == instance)
			instance = new SingleTon();			
		return instance;
	}		
}

这是一个经典的单例模式代码,但是它本身是有问题的,在多线程的情况下,可能会出现多个对象。于是我们做如下的改进

class SingleTon
{
	private static SingleTon instance = null;
	
	private SingleTon(){}

	public static synchronized SingleTon getInsatnce()
	{	
		if(null == instance)
			instance = new SingleTon();	
		
		return instance;
	}		
}

我们给这个方法加上同步机制,这样就不存在多线程的问题了,但是新的问题来了,实际上只有在第一次执行这个方法的时候才需要同步,以后实际上就不需要同步。但是这样写代码,我们每调用一次都需要同步,这显然是很费时费事的。于是我们再进行改进。

class SingleTon {
    private static SingleTon instance = null;
    
    private SingleTon() {}
    
    public static SingleTon getInstance() {
        if (null == instance ) {
            synchronized (SingleTon.class) {
                if (null == instance) {
                	SingleTon = new Siglenton();
                }
            }
        }
        return instance ;
    }
}

这个就好多了,我们称这个为双重检查(DOUBLE-CHECKED),我们先检查对象是否已经创建,如果没有创建我们在进行同步,这样一来只有第一次会同步,刚好符合我们的要求。


上面所说的我们都称他为“懒汉模式”,我们延迟了对象的实例化,下面我们看看所谓的"饿汉模式”

class Singleton {  
    private static Singleton instance= new Singleton();  
    //可以保证线程安全
    private Singleton() {}  
    
    public static Singleton getInstance() {  
        return instance;  
    }  
}


还有一种使用静态内部类的方法

public class Singleton {  
    private static class SingletonHolder {  
        private static final Singleton instance= new Singleton();  
    }  
    
    private Singleton() {} 
     
    public static final Singleton getInstance() {  
        return SingletonHolder.instance;  
    }  
}


© 著作权归作者所有

粉丝 8
博文 13
码字总数 16693
作品 0
武汉
程序员
私信 提问
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.5K
69
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
2018/08/27
0
0
编程中的那些经典套路——设计模式汇总

在正式阅读前,我先谈谈我们该用什么姿势和心态学习设计模式: 如果你还没有过多的编程经验(泛指半年以下),我建议你把它当做小说来看,能看懂多少是多少,因为半年以下经验的程序员用到设...

gzchen
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Alibaba 实战(二) - 关于Spring Boot你不可不知道的实情

0 相关源码 1 什么是Spring Boot 一个快速开发的脚手架 作用 快速创建独立的、生产级的基于Spring的应用程序 特性 无需部署WAR文件 提供starter简化配置 尽可能自动配置Spring以及第三方库 ...

JavaEdge
今天
7
0
TensorFlow 机器学习秘籍中文第二版(初稿)

TensorFlow 入门 介绍 TensorFlow 如何工作 声明变量和张量 使用占位符和变量 使用矩阵 声明操作符 实现激活函数 使用数据源 其他资源 TensorFlow 的方式 介绍 计算图中的操作 对嵌套操作分层...

ApacheCN_飞龙
今天
7
0
五、Java设计模式之迪米特原则

定义:一个对象应该对其他对象保持最小的了解,又叫最小知道原则 尽量降低类与类之间的耦合 优点:降低类之间的耦合 强调只和朋友交流,不和陌生人说话 朋友:出现在成员变量、方法的输入、输...

东风破2019
昨天
23
0
jvm虚拟机结构

1:jvm可操作数据类型分为原始类型和引用类型,因此存在原始值和引用值被应用在赋值,参数,返回和运算操作中,jvm希望在运行时 明确变量的类型,即编译器编译成class文件需要对变量进行类型...

xpp_ba
昨天
5
0
聊聊nacos Service的processClientBeat

序 本文主要研究一下nacos Service的processClientBeat Service.processClientBeat nacos-1.1.3/naming/src/main/java/com/alibaba/nacos/naming/core/Service.java public class Service ex......

go4it
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部