转载请注明出处: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. xsd的解释说明

    schema教程 XML Schema是以XML语言为基础的,它用于可替代DTD.一份XML schema文件描写叙述了XML文档的结构XML Schema语言也被称为XML Schema Defin ...

  2. 排序算法c语言描述---选择排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  3. Windows Phone 启动器

    http://msdn.microsoft.com/zh-CN/library/gg278408(v=vs.92)#BKMK_Launchers using Microsoft.Phone.Contr ...

  4. 算法----选择排序(select sort)

    排序不是一个时间的数组进行排序,找到最小的元素,其与阵列的第一个元素交换,因此,排序的数组. 算法: void sort::select_sort(int* a,const int n) { for( ...

  5. BZOJ 3362 POJ 1984 Navigation Nightmare 并与正确集中检查

    标题效果:一些养殖场是由一些南北或东西向的道路互连. 镶上在不断的过程中会问两个农场是什么曼哈顿的距离,假设现在是不是通信.那么输出-1. 思维:并与正确集中检查,f[i]点i至father[i]距离 ...

  6. ITIL该研究的结论(互联网思维的结合)

    大约ITIL该研究的结论 最近,该公司与组织学习在一起ITIlV3一个Foundation知识. 学了几周了,每周两次课,是上海的同事在share她的理解. 事实上最開始,我个人差点儿没有听过ITIL ...

  7. ImageView建立selector在录音中遇到的小问题及解决方案

    随着两张照片做了一个selector,采用ImageView的src要么background采用selector当点击,总不会出现点击效果,这就是为什么?经过一番折腾,后来发现"揭秘&quo ...

  8. Linux Howto

    1. Customize the Xfce menu http://wiki.xfce.org/howto/customize-menu

  9. Oracle 多行转多列

    Oracle 多行转多列,列值转为列名   前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的 ...

  10. ACM-凸多边形的计算几何——hrbust1429

    凸多边形 称号:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1429 Descri ...