Java 设计模式学习1-单例模式
来源:互联网 发布:微信淘宝优惠券机器人 编辑:程序博客网 时间:2024/06/01 19:20
从今天开始重新整理下Java设计模式的一些知识,好记性不如烂笔头。
文章内容并非原创,整理网络上的一些文章,方便自己查找
在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式。适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象。如Android中常见的Application对象。
通过单例模式,自行实例化并向这个系统提供这个单一实例的访问方法。
根据此单一实例产生的时机不同(当然,都是指第一次,也是唯一一次产生此单一实例时),可以将其分为懒汉式、饿汉式和登记式。
一、懒汉式:
其特点是延迟加载,即当需要用到此单一实例的时候,才去初始化此单一实例。常见经典的写法如下:
1 package com.qqyumidi; 2 3 public class SingleTon { 4 5 // 静态实例变量 6 private static SingleTon instance; 7 8 // 私有化构造函数 9 private SingleTon() {10 11 }12 13 // 静态public方法,向整个应用提供单例获取方式14 public static SingleTon getInstance() {15 if (instance == null) {16 instance = new SingleTon();17 }18 return instance;19 }20 21 }
二、饿汉式:
饿汉式的特点是应用中尚未需要用到此单一实例的时候即先实例化。常见的经典写法为:
1 package com.qqyumidi; 2 3 public class SingleTon { 4 5 // 静态实例变量,直接初始化 6 private static SingleTon instance = new SingleTon(); 7 8 // 私有化构造函数 9 private SingleTon() {10 11 }12 13 // 静态public方法,向整个应用提供单例获取方式14 public static SingleTon getInstance() {15 return instance;16 }17 18 }
三、登记式单例模式:
登记式单例模式,一般是通过一个专门的类对各单例模式的此单一实例进行管理和维护。通过Map方式可以方便的实现此中目的。常见的代码如下:
1 package com.qqyumidi; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class SingleTonManager { 7 8 private static Map singleTonMap = new HashMap(); 9 10 public static void main(String[] args) {11 // 获取A类的单例12 A a = (A) getInstance(A.class.getName());13 // 获取B类的单例14 B b = (B) getInstance(B.class.getName());15 }16 17 // 根据类型获取单例18 public static Object getInstance(String className) {19 // 判断singleTonMap中是否有此单例,有则取得后返回,无则添加单例后返回20 if (!singleTonMap.containsKey(className)) {21 try {22 singleTonMap.put(className, Class.forName(className).newInstance());23 } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {24 // TODO Auto-generated catch block25 e.printStackTrace();26 }27 }28 return singleTonMap.get(className);29 }30 }31 32 class A {33 34 }35 36 class B {37 38 }
另外:需要注意的是,在多线程环境中,以上各种方法构造单例模式需要考虑到线程安全问题。
四、改进型懒汉式(直接满足线程安全)——通过静态内部类实现
在如上的懒汉单例模式中,对于多线程环境中。可以通过常见的如synchronized等方式实现线程安全,同时,可以通过Java静态内部类的方式实现进一步改进。
常见代码如下:
1 package com.qqyumidi; 2 3 public class SingleTon { 4 5 // 利用静态内部类特性实现外部类的单例 6 private static class SingleTonBuilder { 7 private static SingleTon singleTon = new SingleTon(); 8 } 9 10 // 私有化构造函数11 private SingleTon() {12 13 }14 15 public static SingleTon getInstance() {16 return SingleTonBuilder.singleTon;17 }18 19 public static void main(String[] args) {20 SingleTon instance = getInstance();21 }22 }
说明: 第一个singleton==null判断避免不必要的线程同步
参考:
1、 http://www.oschina.net/code/snippet_107039_6062
2、 http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html
- java设计模式学习-单例模式
- java设计模式学习笔记1 单例模式
- Java 设计模式学习1-单例模式
- Java设计模式(1)之单例模式学习总结
- Java设计模式-1-单例模式
- java设计模式(1) - 单例模式
- java设计模式1 单例模式
- Java设计模式(1)单例模式
- Java设计模式(1) 单例模式
- JAVA设计模式(1)----单例模式
- Java设计模式之单例设计模式学习
- java-单例设计模式学习
- JAVA学习九:单例设计模式
- java学习07-单例设计模式
- Java学习--单例设计模式
- java学习--单例设计模式
- 个人学习-java-单例设计模式
- Java学习7:单例设计模式
- UI课程用for循环写n*n棋盘
- GUI for git|SourceTree|入门基础
- js-jquery 倒计时代码
- Struts2-----数据校验
- 写了一个下载网络图片的功能,可以用
- Java 设计模式学习1-单例模式
- 打电话主要代码(意图用法)
- 《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)
- 麻将竞赛规则
- 发短信的主要代码(SmsManger)
- 唤起Android手机中已安装的地图应用
- Vim命令集
- 用户名不在sudoers文件中。此事将被报告。
- eclipse中启动tomcat后,访问tomcat主页,出现404错误原因