单例模式建议保证某个对象仅仅仅仅有一个实例,当仅仅有一个对象来协调整个系统的操作时,在计算机系统中。线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

    以下是单例模式的类图:包含的private和static修饰的实例instance、一个private的构造函数、一个static的getInstance函数

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3NoaXJkZXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="188" height="136" hspace="105" alt="" />

 
单例模式主要有三种:懒汉式单例、饿汉式单例、登记式单例三种

1、饿汉式单例:在类的初始化时候,自行创建了实例

  1. class Singleton1{
  2. public Singleton1() {};
  3. //自行实例化
  4. static private final Singleton1 instance = new Singleton1();
  5. //获取唯一实例
  6. public static Singleton1 getInstance(){
  7. return instance;
  8. }
  9. }

 
2、懒汉式单例:在真正须要的时候在创建唯一实例

  1. //线程安全之中的一个
  2. class Singleton3{
  3. public Singleton3() {};
  4. static private Singleton3 instance = null;
  5. //获取唯一实例
  6. public static synchronized Singleton3 getInstance(){
  7. if(null == instance){
  8. return new Singleton3();
  9. }
  10. return instance;
  11. }
  12. }

3、登记式单例:相似Spring,通过名字匹配获取唯一实例

  1. class Singleton4{
  2. public Singleton4() {};
  3. static private Map<String, Singleton4> map = new HashMap<String,Singleton4>();
  4. static{
  5. Singleton4 single = new Singleton4();
  6. map.put(single.getClass().getName(), single);
  7. }
  8. //依据名字获取唯一实例
  9. public static synchronized Singleton4 getInstance(String name){
  10. if(null == name){
  11. name = Singleton4.class.getName();
  12. System.out.println("name == null"+"--->name="+name);
  13. }
  14. if(null == map.get(name)){
  15. try {
  16. map.put(name, (Singleton4)Class.forName(Singleton4.class.getName()).newInstance());
  17. } catch (InstantiationException e) {
  18. e.printStackTrace();
  19. } catch (IllegalAccessException e) {
  20. e.printStackTrace();
  21. } catch (ClassNotFoundException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. return map.get(name);
  26. }
  27. public String about() {
  28. return "Hello, I am RegSingleton.";
  29. }
  30. }

main函数:

  1. public class MySingleton {
  2. public static void main(String[] args) {
  3. Singleton4 single4 = Singleton4.getInstance(null);
  4. Singleton4 single5 = Singleton4.getInstance(null);
  5. Singleton4 single6 = Singleton4.getInstance("aaa");
  6. Singleton4 single7 = Singleton4.getInstance("bbb");
  7. if(single4 == single5){
  8. System.out.println("single4和single5是同一个实例");
  9. }else{
  10. System.out.println("single4和single5不是同一个实例");
  11. }
  12. if(single6 == single7){
  13. System.out.println("single46和single7是同一个实例");
  14. }else{
  15. System.out.println("single6和single7不是同一个实例");
  16. }
  17. }

输出结果:

  1. name == null--->name=com.Singleton4
  2. name == null--->name=com.Singleton4
  3. single4single5是同一个实例
  4. single6single7不是同一个实例

Java设计模式(二)-单例模式的更多相关文章

  1. java 设计模式之单例模式

    -------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...

  2. Java 设计模式之单例模式(一)

    原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...

  3. java设计模式之单例模式你真的会了吗?(懒汉式篇)

    java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  4. Java 设计模式(二)-六大原则

    Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...

  5. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  6. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...

  7. java设计模式1——单例模式

    java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...

  8. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  9. [转]JAVA设计模式之单例模式

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...

  10. java 设计模式:单例模式

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...

随机推荐

  1. [POJ2749]Building roads(2-SAT)

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8153   Accepted: 2772 De ...

  2. java-银行卡基本信息查询

    用于验证的请求接口: https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo= ...

  3. [转][Android] ListView中getView的原理+如何在ListView中放置多个item

      ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果 ...

  4. Codeforces Round #346 (Div. 2) B. Qualifying Contest 水题

    B. Qualifying Contest 题目连接: http://www.codeforces.com/contest/659/problem/B Description Very soon Be ...

  5. char *p 与char p[]

    char *p=a和char*p=&a 前者p是一个指针变量后者p是一个char型变量 char *p = "123"; 为全局数组,放在常量区,而非普通数据段(静态存储区 ...

  6. 在iOS 7中使用storyboard(part 1)

    原文:Storyboards Tutorial in iOS 7: Part 1        感谢翻译小组成员heartasice热心翻译.如果您有不错的原创或译文,欢迎提交给我们,更欢迎其他朋友加 ...

  7. Android SDK最小需求

    As a minimum when setting up the Android SDK, you should download the latest tools and Android platf ...

  8. Papilio Pro Boards

    http://papilio.cc/index.php?n=Papilio.PapilioOne The Papilio is an Open Source FPGA development boar ...

  9. [转].net reactor 学习系列(四)---.net reactor应用场景

    前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和许可证发放场景.如果想应用更高级的场景比如自动化程序许可证的发放及自定义客户端的过期提示等等就需要自己 ...

  10. 富文本编辑器、日期选择器、软件天堂、防止XSS攻击、字体icon、转pdf

    [超好用的日期选择器] Layui:http://www.layui.com/laydate/ 备注:日期选择器,用过很多很多,自己也写过一些:相信这个简单而又不简单的选择器,能够给你多些美好的时光 ...