一名优秀的程序员总是可以写出简洁切优雅的代码,反观我自己写的代码却充斥这大量if(){}elisa这种十分冗余切不美观的语句,于是业界大佬便创造了23种设计模式供后人膜拜
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
今天带大家讲的是单例模式,是为了保证一个类只能产生出一个对象。起初单例模式的实现有懒汉式和饿汉式最经典的两种实现方式,但随着处女座的程序员愈来愈多又衍生出了两种完美的解决方案,那便是双重检测和静态内部类的方式。但这些方式虽然看似完美无缺,却应为java特殊的反射机制都能被一一破解。于是java的创始人之一写了一种在真正完美的方法,然我们拭目以待吧!
饿汉单例
public class demo1 {
private static final demo1 INSTANCE = new demo1();
private demo1(){};
public static demo1 getInstance(){return INSTANCE;}
}
其特点就是在类加载时就创建该类对象将构造方法私有,只有在调用getInstance()方法时才能获取该对象,由jvm保证线程安全。一般这种是工作中最常用的单例写法简单易懂。
懒汉单例
懒汉单例的诞生是因为有人认为饿汉单只要加载这个类哪怕不使用都会new一个该类对象(
话说你不用它加载它干嘛
)而且懒汉单例也会带来线程不安全。鄙人认为这是多此一举 可能是因为我不是处女座吧
public class demo2 {
private static demo2 INSTANCE;
private demo2(){}
public static demo2 getInstance(){
if (INSTANCE == null){
INSTANCE = new demo2();
}
return INSTANCE;
}
}
懒汉单例升级版
这个写法在懒汉单例的基础上用synchronized加锁的方式保障了线程的安全性,但也让性能大大的降低
public class demo3 {
private static demo3 INSTANCE;
private demo3(){}
public static synchronized demo3 getInstance(){
if (INSTANCE == null){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
INSTANCE = new demo3();
}
return INSTANCE;
}
}
双重检测实现单例
这个写法是完美的写法,即解决了饿汉式的缺点,又保障了线程的安全性,还不用每次调用时来抢锁。有人会说第一个if判断加的作用是什么。那作用可大了,只要第一次调用改方法拿到了instance对象将不会经过synchronized导致性能的下降,同时要注意在instance对象上加volatile防止JIT优化成本地代码防止语句重排后出现的问题(背后原因太复杂涉及到转成c后的问题)
public class demo4 {
private static volatile demo4 INSTANCE;
private demo4(){};
public static demo4 getInstance(){
if (INSTANCE == null){
synchronized (demo4.class){
if (INSTANCE == null){
INSTANCE = new demo4();
}
}
}
return INSTANCE;
}
}
静态内部类
这也是完美的写法之一,静态内部类在只会在调用的时候加载一次,由jvm保障线程安全
public class demo5 {
private demo5(){};
private static class demoHolder{
private static final demo5 INSTANCE = new demo5();
}
public static demo5 getInstance(){
return demoHolder.INSTANCE;
}
}
枚举的实现
这就是最最完美的写法,简单优雅,是由java创始人之一写的单例。
枚举来实现单例就有得天独厚的优势,就好似每年只有一个春天。因为枚举没有构造方法哪怕利用反射义无法创建出其第二个实例对象。
public enum demo6 {
INSTANCE;
}
好了单例模式就讲到这里,下一章小编将为你带来策略模式。。。