意图:
当类需要保证在内存中的唯一性或者不想创建多个实例浪费资源
情景:第一次进入登陆英雄联盟时系统会要求输入一个角色名,当然这个名字不能乱输,这里我们就可以使用专门的名字检测类去判断用户输入的字符串是否合法,登陆成功后的玩家聊天中的敏感我们也可以用这个类去检测,这时就非常适合用单利模式,在任何我们需要用到的地方直接去调用它。
饿汉式:
由于类加载机制,即使没有用到它,依然可能加载,从而造成内存浪费(最简便的方式)
/**
* Created by LSX on 2018/4/9.
*
饿汉式
* note:
由于类加载机制原因,可能造成内存浪费
(
最简单
)
*/
public class
SingletonOne {
private static
SingletonOne
mMySingleton
=
new
SingletonOne()
;
private
SingletonOne
() {
}
public static
SingletonOne
getInstance
() {
return
mMySingleton
;
}
public
String
checkHero
(String name){
return
"
检测英雄
ID
是否符合规范
"
;
}
}
懒汉式:
需要synchronizedg同步关键字保证线程安全,每次getInstance都会进行一次同步,效率略低
/**
* Created by LSX on 2018/4/9.
*
懒汉式
* note
:需要
synchronizedg
同步关键字保证线程安全
*/
public class
SingletonTwo {
private static
SingletonTwo
mMySingleton
;
private
SingletonTwo
() {
}
public synchronized static
SingletonTwo
getInstance
() {
if
(
mMySingleton
==
null
) {
mMySingleton
=
new
SingletonTwo()
;
}
return
mMySingleton
;
}
public
String
checkHero
(String name) {
return
"
检测英雄
ID
是否符合规范
"
;
}
}
静态内部类单利:
类被加载时就会实例化(和饿汉式一样,保证了线程安全)并且由于final的作用(类加载机制)只会在调用getInstance时才会装载Holder(最优写法)
/**
* Created by LSX on 2018/4/9.
*
静态内部类单利
* note:
最优写法
*/
public class
SingletonThread {
private
SingletonThread
() {
}
public static final
SingletonThread
getInstance
() {
return
MySingletonHolder.
mMySingleton
;
}
public
String
checkHero
(String name){
return
"
检测英雄
ID
是否符合规范
"
;
}
private static class
MySingletonHolder {
private static
SingletonThread
mMySingleton
=
new
SingletonThread()
;
}
}
调用
/*
*
单利模式
* **/
private void
singleton
(String name) {
SingletonThread.
getInstance
().checkHero(name)
;
}
单利的容器:
将所有单利注入一个统一的管理类,使用时统一获取,让我们可以管理多种类型的单利
/**
* Created by shixin-pc on 2018/4/8.
* 单利的容器
* note:将单利注入一个统一的管理类
*/
public class
MySingleton {
private static
HashMap<String, Object>
mHashMap
=
new
HashMap<>();
private
MySingleton() {
}
public static void
register(String key, Object instance) {
if
(!
mHashMap
.containsKey(key)) {
mHashMap
.put(key, instance);
}
}
public static
Object getInstance(String key) {
if
(
mHashMap
!=
null
&& key !=
null
) {
mHashMap
.get(key);
}
return null
;
}
}