文档章节

Java设计模式之单例模式

断桥残雪断桥残雪
 断桥残雪断桥残雪
发布于 2015/08/02 19:31
字数 1228
阅读 103
收藏 5

单例模式介绍

单例模式(Singleton)顾名思义,是一种对象创建型模式,保证一个类只有一个实例,并提供一个访问它的全局访问点。为此,我们需要保证一个类只有一个实例并且这个实例易于被我们访问,一个 全局变量使得一个对象可以被访问,但他不能防止你实例化多个对象。如下面的全局对象的使用:

Dog类:

public class Dog{
	private String name;
        public Dog(String name) {
            System.out.println("Dog's name is "+name);
        }
}



在另外一段代码中声明全局变量的对象dog:
public Dog dog = new Dog("Peter");



这样并不能保证只有一只狗这个对象存在。 一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它提供一个访问该实例的方法。这就是单例模式。

单例模式的适用性

在下面情况下可以适用单例模式:

    当类只有一个实例而且客户可以从一个众所周知的访问点访问它;

    当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能适用一个扩展的实例。

单例模式的设计方法

单例模式需要保证类的构造方法为私有的,即private修饰符,以保证外界不能实例化这个类的对象。

而且单例模式需要该类自身创建自己的静态对象,并且需要定义一个getInstance()方法,即允许客户访问它的唯一实例。

单例模式的分类

单例模式分为饿汉模式和懒汉模式饿汉模式是指在编译时自动创建对象,运行时直接调用即可,这种创建方法的优点是加载慢,运行快,并且具有线程安全性;懒汉模式是编译时不会创建对象,仅在客户第一次访问时才创建该对象,这种创建方法的优点则相反,加载快,运行慢,并且不具有线程安全性。

单例模式示例代码

首先我们来写一个通用的饿汉模式程序模板:

package com.singleton.hangry;
/**
 * 设计模式之单例模式
 * 饿汉模式
 * 加载慢,运行快,线程安全
 * @author zzw
 *
 */
public class HangryPattern {
	private HangryPattern() {
		System.out.println("单例模式之饿汉模式"+"\r\n"+"特点:加载慢,运行快,线程安全");
	}
	private static HangryPattern hangryPattern = new HangryPattern();
	
	public static HangryPattern getInstance() {
		return hangryPattern;
	}
}



我们可以看到,上面代码中仅有getInstance()方法为public static,即客户只能调用此方法,此处我们为了通用性,不去关心单例的具体实现细节,接下来我们来写一个客户测试类:
package com.singleton.hangry;

public class Test {

	public static void main(String[] args) {
		HangryPattern hangryPattern = HangryPattern.getInstance();
	}

}



同样,我们来写一个通用的懒汉模式程序模板:

package com.singleton.lazy;
/**
 * 设计模式之单例模式
 * 懒汉模式
 * 加载快,运行慢,线程不安全
 * @author zzw
 *
 */
public class LazyPattern {
	
	private LazyPattern() {
		System.out.println("单例模式之懒汉模式"+"\r\n"+"特点:加载快,运行慢,线程不安全");
	}
	
	private static LazyPattern lazyPattern;
	
	public static LazyPattern getInstance() {
		if(lazyPattern == null) {
			lazyPattern = new LazyPattern();
		}
		return lazyPattern;
	}
}



我们可以看到,上面代码中仅有getInstance()方法为public static,即客户只能调用此方法,并且,懒汉模式中仅在客户第一次调用时才会创建。此处我们为了通用性,不去关心单例的具体实现细节,接下来我们来写一个客户测试类:
package com.singleton.lazy;

public class Test {

	public static void main(String[] args) {
		LazyPattern lazyPattern = LazyPattern.getInstance();
	}
}



这样我们就完成了饿汉模式和懒汉模式的模板代码了,按照具体项目的实现细节,可以套用该模板代码去应用单例设计模式。

要注意,在单一线程中,可以两者随便使用;但是在多线程共享时,最好使用饿汉模式,因为它是线程安全的。

单例设计模式的优点

最后,我们来总结一下单例设计模式的优点:

    可以对唯一实例进行受控访问;

    能够减少过多的变量声明,这是对比存储唯一实例的全局变量而得出的;

    允许对操作和表示进行精细,Singleton类可以拥有子类,而且用这个扩展类的实例来配置一个应用是很容易的,此外,还可以用相同的方法来控制应用所使用的实例的数目。只有允许访问Singleton实例的操作需要改变。

© 著作权归作者所有

断桥残雪断桥残雪
粉丝 53
博文 139
码字总数 94909
作品 0
广州
程序员
私信 提问
加载中

评论(2)

OSC_fgayfF
OSC_fgayfF
不知道他的实际作用有什么好处
火神救我
火神救我
hangry...3
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
296
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
219
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
277
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
25分钟前
24
3
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部