单例模式
Q:什么是单例模式呢?
A:单例模式确保某个类只有一个实例大家想用这个类的对象的时候只能拿到一个共同的实例单例类要自行创建实例
Q:为什么要用到单例模式?
A:如果有一个复杂的类我们总要使用它的对象那我们岂不是总要new这个对象这样会消耗我们的内存所以我们要选用单例模式
下面通过一个简单的例子说明单例模式的实现方法
//普通的类通过new来创建新的对象每次创建都会得到不同的实例
public class SingletonDemo{
//构造方法
public SingletonDemo(){}
//普通方法
public void singleLove(){
Systemoutprintln(Persist for you!)
}
}
//使用第一种方式的单例模式类通过公共属性来创建对象
public class SingletonDemo{
//第一种实现单例模式的方法通过公共属性来实现实例化
//声明一个公共的静态属性使只被实例化一次
public static final SingletonDemo singletonDemo = new SingletonDemo()
//声明一个私有的构造方法使别人不能随便new对象
private SingletonDemo(){}
//普通的方法
public void singleLove(){
Systemoutprintln(Always persist for you!)
}
}
//使用第二种方式的单例模式类通过getInstance()来创建对象
public class SingletonDemo{
//第二种实现单例模式的方法通过方法来实现实例化
//声明一个私有的静态属性使只被实例化一次
private static final SingletonDemo singletonDemo = new SingletonDemo()
//声明一个私有的构造方法使别人不能随便new对象
//它只被调用一次实例存在之后就不再调用了
private SingletonDemo(){}
//声明一个公共的静态方法外界通过调用这个方法来得到唯一的实例
public static SingletonDemo getInstance(){
return singletonDemo;
}
//普通的方法
public void singleLove(){
Systemoutprintln(Persist for you always!)
} }
public class Test{ //测试方法 public static void main(String[] args){
//测试
SingletonDemo singleton = new SingletonDemo()
singletonsingleLove()
SingletonDemo singleton = new SingletonDemo()
singletonsingleLove()
boolean flag = singletonequals(singleton)
Systemoutprintln(用equals的方法来判断)
Systemoutprintln(此时的flag= + flag)
if(flag){
Systemoutprintln(他们的内存地址是一样的哦这说明他们是同一个实例实现了单例模式!)
}else{
Systemoutprintln(他们的内存地址不一样则说明他们是不同的实例)
}
//测试
SingletonDemo singleton = SingletonDemosingletonDemo;
singletonsingleLove()
SingletonDemo singleton = SingletonDemosingletonDemo;
singletonsingleLove()
int addr = singletonhashCode()
int addr = singletonhashCode()
Systemoutprintln(用hashCode来判断)
if(addr == addr){
Systemoutprintln(内存地址是一样的哦则说明他们是同一个实例实现了单例模式)
}else{
Systemoutprintln(他们的内存地址不一样则说明他们是不同的实例)
}
//测试
SingletonDemo single = SingletonDemogetInstance()
singlesingleLove()
SingletonDemo single = SingletonDemogetInstance()
singlesingleLove()
boolean flag = singleequals(single)
Systemoutprintln(用equals来判断)
Systemoutprintln(此时的flag= + flag)
if(flag){
Systemoutprintln(内存地址是一样的哦则说明他们是同一个实例实现了单例模式)
}else{
Systemoutprintln(他们的内存地址不一样则说明他们是不同的实例)
}
} }
说明根据个人使用经验推荐使用方法三