Java设计模式(二)-单例模式
单例模式建议保证某个对象仅仅仅仅有一个实例,当仅仅有一个对象来协调整个系统的操作时,在计算机系统中。线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
以下是单例模式的类图:包含的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设计模式(二)-单例模式的更多相关文章
- java 设计模式之单例模式
-------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...
- Java 设计模式之单例模式(一)
原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- Java 设计模式(二)-六大原则
Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...
- 折腾Java设计模式之单例模式
博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...
- java设计模式1——单例模式
java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
- java 设计模式:单例模式
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...
随机推荐
- luogu P4137 mex
题面: 有一个长度为$n$的数组${a1,a2,…,an}$.$m$次询问,每次询问一个区间内最小没有出现过的自然数. 令$lst[i][r]$表示在$[1, r]$中数值$i$最后出现的位置 那么, ...
- POJ2222 Keywords Search AC自动机模板
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出一些单词,求多少个单词在字符串中出现过(单词表单词可能有相同的,这些相同的单词视为不同的分别计数 ...
- hdu 2795 Billboard 线段树单点更新
Billboard Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=279 ...
- HTML5 元素拖动 - 实现元素左右拖动, 或更改自身排序
1.拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放是一种常见的特性,即抓取对象以后拖到另一个位置.在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 浏览器支持:Int ...
- CentOS 6.9/7通过yum安装指定版本的JDK/Maven
说明:通过yum好处其实很多,环境变量不用配置,配置文件放在大家都熟悉的地方,通过rpm -ql xxx可以知道全部文件的地方等等. 一.安装JDK(Oracle JDK 1.8) # wget -- ...
- How to let TVirtualStringTree to display an icon in disabled state?
How to let TVirtualStringTree to display an icon in disabled state? I need to display files in a dir ...
- 单向可控硅(SCR)双向可控硅(TRIAC)
双向可控硅工作原理与特点 从理论上来讲,双向可控硅可以说是有两个反向并列的单向可控硅组成,理解单向可控硅的工作原理是理解双向可控硅工作原理的基础 单向可控硅 单向可控硅也叫晶闸管,其组成结构图如图1- ...
- SpringMvc(1) --Eclipse搭建web项目
http://blog.csdn.net/uucai http://blog.csdn.net/uucai/article/details/21258575
- 擦亮自己的眼睛去看SQLServer之谈谈锁机制
http://www.cnblogs.com/yueyue_jwfm/category/292724.html
- 三分钟教你学Git (四)之紧急救助
假设你不小心git reset --hard HEAD^ 然后这个commit又没有在别的git仓库中,怎么办?是不是这次改动就丢了呢? 当然不是,git为我们每次都历史都保留了reference l ...