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

    以下是单例模式的类图:包含的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、饿汉式单例:在类的初始化时候,自行创建了实例

class Singleton1{
public Singleton1() {};
//自行实例化
static private final Singleton1 instance = new Singleton1();
//获取唯一实例
public static Singleton1 getInstance(){
return instance;
}
}

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

//线程安全之中的一个
class Singleton3{
public Singleton3() {};
static private Singleton3 instance = null;
//获取唯一实例
public static synchronized Singleton3 getInstance(){
if(null == instance){
return new Singleton3();
}
return instance;
}
}

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

class Singleton4{
public Singleton4() {};
static private Map<String, Singleton4> map = new HashMap<String,Singleton4>();
static{
Singleton4 single = new Singleton4();
map.put(single.getClass().getName(), single);
}
//依据名字获取唯一实例
public static synchronized Singleton4 getInstance(String name){
if(null == name){
name = Singleton4.class.getName();
System.out.println("name == null"+"--->name="+name);
}
if(null == map.get(name)){
try {
map.put(name, (Singleton4)Class.forName(Singleton4.class.getName()).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
public String about() {
return "Hello, I am RegSingleton.";
}
}

main函数:

public class MySingleton {
public static void main(String[] args) {
Singleton4 single4 = Singleton4.getInstance(null);
Singleton4 single5 = Singleton4.getInstance(null);
Singleton4 single6 = Singleton4.getInstance("aaa");
Singleton4 single7 = Singleton4.getInstance("bbb");
if(single4 == single5){
System.out.println("single4和single5是同一个实例");
}else{
System.out.println("single4和single5不是同一个实例");
}
if(single6 == single7){
System.out.println("single46和single7是同一个实例");
}else{
System.out.println("single6和single7不是同一个实例");
}
}

输出结果:

name == null--->name=com.Singleton4
name == null--->name=com.Singleton4
single4和single5是同一个实例
single6和single7不是同一个实例

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. [BZOJ1937][SHOI2004]Mst最小生成树(KM算法,最大费用流)

    1937: [Shoi2004]Mst 最小生成树 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 802  Solved: 344[Submit][Sta ...

  2. 【洛谷】P1063 能量项链【区间DP】

    P1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子, ...

  3. PHP 日期的加减

  4. mybatis源码分析(4)----org.apache.ibatis.binding包

    1.  我们通过接口操作数据库时,发现相关的操作都是在org.apache.ibatis.binding下 从sqSessin 获取getMapper() SqlSession session = s ...

  5. Spring EL方法调用实例

    Spring表达式语言(使用SpEL)允许开发人员使用表达式来执行方法和将返回值以注入的方式到属性,或叫作“使用SpEL方法调用”. Spring EL在注解的形式 了解如何实现Spring EL方法 ...

  6. unsigned int与int相加的问题-----C/C++小知识 区别

    http://blog.csdn.net/thefutureisour/article/details/8147277 #include "stdafx.h" int _tmain ...

  7. C# 读取EXCEL文件出现数据丢失问题,数据不完整

    将EXCEL数据导出的时候如果同一列数据中既有文字,又有数字!读取时一列中要么文字丢失只剩下数字,要么数字丢失,只剩下文字,这是由第一行的数据类型决定的.出现这种问题是由于数据类型不统一造成的. 原来 ...

  8. c#封装三维向量,另外也看了下别人的C++封装

    一. c#实现 /* Vector3 Definition Created by taotao man on 2016-4-12 brief:封装三位向量类Vector3 // 修改记录: date: ...

  9. PulsingHalo(自定义涟漪)的使用方法

    PulsingHalo的git地址是: https://github.com/shu223/PulsingHalo Objective - C 一丶PulsingHalo的实例化和启动: Pulsin ...

  10. 用10张图来看机器学习Machine learning in 10 pictures

    I find myself coming back to the same few pictures when explaining basic machine learning concepts. ...