什么是设计模式?
经过程序员的多次实践,总结出来的一套最佳实践。是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
单列设计模式?
一个类在内存中只有一个对象,不能再去创建其他对象
应用:在日常开发中,封装工具类(只需要一个对象)
优点:1.控制资源的使用
2.控制实例的产生数量,达到节省资源的目的
3.共享数据
饿汉模式
1.必须得要在该类中创建一个对象出来
2.私有化构造器,防止外界通过构造器来创建新的对象
3.给外界提供一个方法,能够获取已经创建好的对象
public class HungerSingletonTest {
//1.new出一个对象且私有化
private final HungerSingletonTest instance = new HungerSingletonTest();
//2.私有化构造器
private HungerSingletonTest(){
}
//3.给外界提供一个方法
public HungerSingletonTest getInstance(){
return instance;
}
}
这个饿汉模式的问题在于,外界无法访问,访问只能调用其getInstance方法,但又无法new出对象来调用,因此将方法getInstance 写成静态方法让外界通过类名直接调用,又因为静态方法中的内容也应该是静态的,因此将instance也改为静态
public class HungerSingletonTest {
//1.实例化一个对象
private static HungerSingletonTest instance = new HungerSingletonTest();
//私有化构造器
private HungerSingletonTest(){
}
//提供外界访问的方法
public static HungerSingletonTest getInstance(){
return instance;
}
}
懒汉模式
public class SingletonTest1 {
//先声明一个对象
private static SingletonTest1 singletonTest1;
//提供供外界调用对象的方法
public static SingletonTest1 getSingletonTest1(){
if(null == singletonTest1){
SingletonTest1 singletonTest1 = new SingletonTest1();
}
return singletonTest1;
}
//私有化构造器
private SingletonTest1(){
}
}
代码分析:非线程安全的,如果有两个线程同时调用getSingletonTest1()这个方法,那么就会new出两个实例
public class SingletonTest2 {
//声明对象
private static SingletonTest2 singletonTest2;
//提供供外界访问的方法 加锁 线程安全
public static synchronized SingletonTest2 getSingletonTest2(){
if(null == singletonTest2){
SingletonTest2 singletonTest2 = new SingletonTest2();
}
return singletonTest2;
}
//私有化构造器
private SingletonTest2(){
}
}
代码分析:如果有多个线程调用getInstance()方法,当一个线程获取该方法,而其它线程必须等待,消耗资源。