认识
单例模式是23种设计模式中最简单的模式了,所谓单例,就是说一个类只能有一个实例。大白话:对象是唯一的,不可能有第二个,比如说世界上不可能有两片相同的花瓣,也没有两片相同的雪花,当然也没有第二个昆仑(月亮)。对风花雪月没什么概念的话,那就看看Java里的单例吧。
在Java里得ServletContext、Spring里的ApplicationContext、数据库中的连接池…好多都是单例模式。
特点
1.单例类只有一个实例
2.这个实例必须由单例类自身创建
3.单例类对外提供一个访问它的全局访问点
实现
用懒汉模式模拟赏月
public class SingletonLazy {
public static void main(String[] args) {
Moon m1 = Moon.getInstance();
m1.getName();
Moon m2 = Moon.getInstance();
m2.getName();
System.out.println(m1 == m2 ? "它们是同一个月亮" : "它们不是同一个月亮");;
}
}
class Moon {
private static volatile Moon instance=null; //保证instance在所有线程中同步
//private避免类在外部被实例化
private Moon()
{
System.out.println("天上有一轮明月");
}
public static synchronized Moon getInstance()
{
//在getInstance方法上加同步
if(instance==null)
{
instance=new Moon();
}
else
{
System.out.println("天上已经有月亮了");
}
return instance;
}
public void getName()
{
System.out.println("名字:昆仑");
}
}
打印结果
天上有一轮明月
名字:昆仑
天上已经有月亮了
名字:昆仑
它们是同一个月亮
用饿汉模式模拟赏月
class Moon {
private static final Moon instance= new Moon();
private Moon()
{
System.out.println("天上有一轮明月");
}
public static Moon getInstance()
{
return instance;
}
public void getName()
{
System.out.println("名字:昆仑");
}
}
打印结果
天上有一轮明月
名字:昆仑
名字:昆仑
它们是同一个月亮