转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403

单例模式(Singleton):是一种经常使用的设计模式。

在Java应用中。单例对象能保证在一个JVM中。该对象仅仅有一个实例存在。

优点主要有:1、某些类创建比較频繁,对于一些大型的对象,这是一笔非常大的系统开销。

2、省去了new操作符,减少了系统内存的使用频率,减轻GC压力。

单例模式主要有两种实现方式:1、懒汉式。2、饿汉式

一、uml建模

二、代码实现:

1、懒汉式

/**
* 演示样例:单例--单例对象能保证在一个JVM中。该对象仅仅有一个实例存在。
*
* 缺点:这样的做法在多线程环境下,不安全
*
* 懒汉式
*/ class Singleton {
/**
* 持有私有静态变量(也称类变量),防止被引用
*
* 此处赋值为null。目的是实现延迟载入 (由于有些类比較庞大,所以延迟载入有助于提升性能)
*/
private static Singleton instance = null; /** 私有构造方法,防止被实例化 */
private Singleton() { } /** 静态工厂方法,创建实例 --仅仅只是这里是创建自己,并且仅仅能创建一个 */
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
} public void info() {
System.out.println("this is a test method...");
}
} /**
* client測试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
/**
* 调用普通方法
*/
s1.info();
Singleton s2 = Singleton.getInstance();
/**
* 执行结果为true。说明s1、s2这两个类变量都指向内存中的同一个对象
*/
System.out.println(s1 == s2);
}
}

2、饿汉式

/**
* 饿汉式
*/ class Singleton {
private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() {
return instance;
} public void info() {
System.out.println("this is a test method...");
}
} /**
* client測试类
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
/**
* 调用普通方法
*/
s1.info();
Singleton s2 = Singleton.getInstance();
/**
* 执行结果为true,说明s1、s2这两个类变量都指向内存中的同一个对象
*/
System.out.println(s1 == s2);
} }

3、假设考虑多线程,那么getInstance()方法要加同步synchronized,这时饿汉式比懒汉式要好。虽然资源利用率要差,可是不用同步。

/**
*
* 考虑多线程的时候。以下这样的做法能够參考一下:--懒汉式
*
* 在创建类的时候进行同步。所以仅仅要将创建和getInstance()分开,单独为创建加synchronizedkeyword
*
* 这样的做法考虑性能的话,整个程序仅仅需创建一次实例,所以性能也不会有什么影响。
*
* @author Leo
*/
public class SingletonTest { private static SingletonTest instance = null; private SingletonTest() {
} private static synchronized void syncInit() {
if (instance == null) {
instance = new SingletonTest();
}
} public static SingletonTest getInstance() {
if (instance == null) {
syncInit();
}
return instance;
}
}

三、总结

单例模式保证了一个类仅仅有一个实例,且提供一个訪问全局点的方式,更加灵活的保证了实例的创建和訪问约束。

系统中仅仅有一个实例。因此构造方法应该为私有 饿汉式:类载入时直接创建静态实例。懒汉式:第一次须要时才创建一个实例,那么getInstance方法要加同步 饿汉式比懒汉式要好。虽然资源利用率要差。可是不用同步。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Java设计模式偷跑系列(六)Singleton模式的建模与实现的更多相关文章

  1. Java设计模式偷跑系列(十八)建模和责任链模式的实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每一 ...

  2. Java设计模式偷跑系列(十二)组合模式建模和实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-总体模式.将对象组合成 ...

  3. Java设计模式偷跑系列(21)建模和实现享受metapatterns

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40021651 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象. ...

  4. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  5. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  6. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  7. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  8. Java设计模式(十一) 享元模式

    原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...

  9. Java设计模式(14)责任链模式(Chain of Responsibility模式)

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

随机推荐

  1. 懵懵懂懂初识J2EE

    一.定义 Java2平台包含:标准版.企业版.微缩版.当中J2SE是Java2的标准版,主要用 于桌面应用软件的编程:J2ME是微缩版,主要应用于嵌入式系统开发:还有这次学习的J2EE是Java2的企 ...

  2. 第四-generation音频:互联网智能声音会火

    我把声音分成四个年龄:传统的立体声插头线-蓝牙音响-wifi发出声音-智能声音. 传统的立体声插头线:传统的声音,您必须使用电缆和其他输入源.这样的声音是现在市场上最流行的音频上. 蓝牙音响:蓝牙无线 ...

  3. 2014.06.14 GlusterFS技术交流视频

    6月14线下GlusterFS视频交流.高清视频是非常好的,我初听言论方面,谈到迅速,似乎不是很清楚,讲座结束后速度需要改进.谢谢能力的天空AbleSky高大内设,谢谢学生参加. 在线公开课:http ...

  4. Team Foundation Server 2015使用教程--默认团队权限说明

  5. VB.Net出口Excel原则

        在VB机房的版本中,我们已经暴露导出Excel特征,此功能已重新接触到不同的理解 一.原理 要实现导出Excel的功能,首先要引用命名空间,目的是能够使用该命名空间下的方法和类 Imports ...

  6. Android Notification (转)

    上回我们提到在4.0ICS之后,Google为Android平台的Notification这把“倚天剑”注入了更多新鲜的元素,使其更加实用美观.Notification的样式从此变得丰富起来,以适应于 ...

  7. NGUI Example5 演示示例评论– lights and Refraction

     NGUI Example5 – lights and Refraction        NUI这个系统是在是牛.比unity3D里面自带的gui要好用得多.还能够为GUI加入法线贴图! 哈哈. ...

  8. requirejs实现模块化

    使用requirejs实现模块化编程 > 序言 - -# 公司大了,业务多了,前端代码量也逐渐增大,我们渐渐的依赖js实现的交互越来越多,长期以来会导致我们的代码维护越来越困难,所以依赖的插件也 ...

  9. Spark编译与部署

    Spark入门实战系列--2.Spark编译与部署(上)--基础环境搭建   [注] 1.该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取: 2.S ...

  10. PL/SQL编程(1) - 存储过程,函数以及参数

    存储过程 PROCEDURE [schema.]name[( parameter[, parameter...] ) ] [AUTHID DEFINER | CURRENT_USER ] [ACCES ...