Java设计模式偷跑系列(六)Singleton模式的建模与实现
转载请注明出处: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模式的建模与实现的更多相关文章
- Java设计模式偷跑系列(十八)建模和责任链模式的实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每一 ...
- Java设计模式偷跑系列(十二)组合模式建模和实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-总体模式.将对象组合成 ...
- Java设计模式偷跑系列(21)建模和实现享受metapatterns
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40021651 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象. ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式(十一) 享元模式
原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...
- Java设计模式(14)责任链模式(Chain of Responsibility模式)
Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
随机推荐
- Struts2 拦截器—拦截action
对于拦截器的基本使用这里我就懒得打字了,我这里就讲下如何用 Struts2 拦截器 拦截action.这是我个人的想法,如果有什么不对的,或者你们有什么更好的方法.请多多留言! 拦截器的默认拦截的方法 ...
- IT该忍者神龟Jquery小工具easyUI物业摘要召回
找了个时间看了下EasyUI插件.对它的插件感觉是非常舒服,特地把Easy UI的大部分功能属性做了一下汇总. 此属性列表请对比jQuery EasyUI 1.0.5,关于它的很多其它资讯请猛击这里. ...
- 高效C++规划
推荐写C++代码风格.看似easy.坚持不易,且写且珍惜! --陈国林 1. 版本号和版本号声明 版本号和版本号文件声明位于头文件和定义文件的开头,主要内容 (1)版本号信息 (2)文件名.标识符.摘 ...
- RDIFramework.NET ━ .NET高速信息系统开发框架钜献 V2.9 版本震撼发布
RDIFramework.NET ━ .NET高速信息化系统开发框架钜献 V2.9 版本号震撼公布 全新体验.全新感觉.2015钜献! 继上个版本号"RDIFramework.NET V2 ...
- DOM笔记2
<!-- 节点类型检查 if(someNode.nodeType==ElementNode){ alert("Node is an element"); } 或者 if(so ...
- 【Linux命令】--(9)其他常用命令
其他常用命令+++++++++++++++++++++++++++++++lndiffdatecal grep wcpswatchatcrontab++++++++++++++++++++++++++ ...
- 导航控制器生产,push,pop,root,index
AppDelegate.m #import "FirstViewController.h" @implementation AppDelegate - (BOOL)applicat ...
- 前端插件@user
分享一个 @user 前端插件 开源地址:https://github.com/yuezhongxin/Mention.js 插件效果:类似于微博或 github 中 @user 列表效果. 这是 ...
- atitit.提升稳定性---hibernate 添加重试retry 机制解决数据库连接关闭
atitit.提升稳定性---hibernate 添加重试retry 机制解决数据库连接关闭 1. 流程总结 retry(5times).invoke(xxx).test().rest().$() t ...
- 深和学习导航CSS样式
一个很容易理解,具体导航栏CSS授课风格 诚奉献给朋友: 原文地址:点击这里.