设计模式:
是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱 俗称”套路“
单例模式
所谓类的单例模式 就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象 我们首先必须将类的构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类的内部仍然可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法 以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以 指向类内部产生的该类对象的变量也必须定义成静态的。
具体写法如下(4种)
1.单例(Singleton)设计模式 - 饿汉式
class Singleton{
//1.私有化构造方法
private Singleton(){
}
//2.类的内部提供一个当前类的实例
//4.此实例也必须静态化
private static Singleton single = new Singleton();
//3.提供公共的 静态的 get方法
public static Singleton getInstance(){
return single;
}
}
此种方法是饿汉式
特点: 不管是否用到 先new一个新的实例
2.单例(Singleton)设计模式 - 懒汉式
class Singleton{
//1.私有化构造方法
private Singleton(){
}
//2.类的内部先声明当前类
//4.必须静态化
private static Singleton single;
//3.提供公共的静态的 get方法
public static Singleton getInstance(){
//判断当前实例是否为null
if(single == null){
//如果为null,则new一个实例
single = new Singleton();
}
return single;
}
}
懒汉式
特点:先声明实例 当用到时再new出实例 线程不安全
3.单例(Singleton)模式 - 双重锁式
class Singleton{
//1.提供私有的构造方法
private Singleton(){
}
//2.声明实例
private volatile static Singleton single;
//3.提供公共的 静态的 get方法
public static Singleton getInstance(){
if(single == null){
synchronized(Singleton.class){
if(single == null){
single = new Singleton();
}
}
}
return single;
}
}
双重锁式: 重写了懒汉式,线程安全
4.单例(Singleton)模式 - 静态内部类式
class Singleton{
//1.提供私有的构造方法
private Singleton(){
}
//2.创建静态内部类
class StaticSingleton{
//3.类中实例化外部类的对象,用static final修饰
//final 修饰对象 此对象不能再new实例
private static final Singleton single = new Singleton();
}
//4.提供公关的 静态的 get方法 获取内部类中的外部类实例对象
public static Singleton getInstance(){
return StaticSingleton.single;
}
}
测试方法:
通过单例模式设计的类 无论实例化几次 在内存中都会只想一个地址
实例化方法:
Singleton single = Singleton.getInstance();
验证方法:
Singleton single1 = Singleton.getInstance();
Singleton single2 = Singleton.getInstance();
System.out.println(single1 == single2);
如果输出结果为 true 则表示内存地址相等 设计成功