注:设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。
23种设计模式。
一、单例设计模式:
解决的问题:使得一个类只能创建一个对象。
方法一(饿汉式):
public class TestSingleton {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);//true
}
}
class Singleton {
//1.私有化构造器,使得在类的外部不能调用此构造器
private Singleton() {
}
//2.在类的内部创建一个类的实例,当加载Singleton类时就创建好了实例对象
private static Singleton instance = new Singleton();
//3.通过公共的方法来调用私有的对象
//4.此公共的方法只能通过类来调用,因此设置为static,同时类的实例也必须为static声明,所以2.需要static关键字
public static Singleton getInstance() {
return instance;
}
}
方法二(懒汉式:可能存在线程安全问题):
public class TestSingleton {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);//true
}
}
class Singleton {
//1.私有化构造器,使得在类的外部不能调用此构造器
private Singleton() {
}
//2.在类的内部创建一个类的实例,当加载Singleton类时就创建好了实例对象
private static Singleton instance = null;
//3.通过公共的方法来调用私有的对象
//4.此公共的方法只能通过类来调用,因此设置为static,同时类的实例也必须为static声明,所以2.需要static关键字
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉式线程安全解决方式:
/*
* 对于懒汉式的线程安全问题:使用同步机制
* 对于一般的方法内,使用同步代码块,可以考虑使用this。
* 对于静态方法而言,使用当前类本身充当锁。
*/
public class TestSingleton {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);//true
}
}
class Singleton {
//1.私有化构造器,使得在类的外部不能调用此构造器
private Singleton() {
}
//2.在类的内部创建一个类的实例,当加载Singleton类时就创建好了实例对象
private static Singleton instance = null;
//3.通过公共的方法来调用私有的对象
//4.此公共的方法只能通过类来调用,因此设置为static,同时类的实例也必须为static声明,所以2.需要static关键字
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}