文章目录
设计模式通俗的将,就是编程中的一些套路,目的就是让我们的代码实现特定的目的,结构上也能更加优秀。
【1】单例模式(singleton)
(1)定义
虚拟机中这个类只有一个实例对象
(2)方法
方法一:(饿汉式单例)
通俗来讲就是一开始就创建好这个实例对象
public class singleton {
//饿汉式单例
//先让构造方法私有化,别人就没办法创建此类的实例了
private singleton(){
}
//自己创建这个实例
private static singleton ME = new singleton();
//获取唯一实例
public static singleton getInstance(){
return ME;
}
}
class Test{
public static void main(String[] args) {
//不能在外部new singleton实例对象 只能通过getInstance()获取唯一的对象
singleton me = singleton.getInstance();
}
}
方法二:(懒汉式单例)
定义:
也就是用不到时不创建,用到时才创建
方法:
(在多线程情况下为了保证真正单例,方法上加synchronized实现同步,也就是说如果有多个线程需要使用singleton2实例对象时,其他线程需要等待正在使用此对象的线程释放锁之后才能对其进行操作)
public class singleton2 {
//懒汉式单例
//构造方法私有
private singleton2(){
}
//只声明对象
private static singleton2 ME;
//获取唯一实例
public static singleton2 getInstance(){
//当第一次调用时ME==null为真,当后续调用时ME==null为假,就不会创建新对象了
if(ME==null){
ME=new singleton2();
}
return ME;
}
}
方法三:(枚举类实现单例:实质上属于饿汉式单例)
public enum singletonenum {
ME;
}
方法四:
还有一种更安全效率更高的方式:
因为在匿名内部类里面实现唯一实例的创建,JVM会保证它的安全性,不用加锁,提高程序的性能。
public class singletoneffictive {
//构造方法私有化
private singletoneffictive(){}
//静态内部类
private static class Holder{
//JVM会保证类加载是安全的
static singletoneffictive ME = new singletoneffictive();
//创建唯一实例
//在第一次类加载的时候就会被初始化,以后不会进行类加载
}
public static singletoneffictive getInstance(){
return Holder.ME;
}
}
破坏单例的方法
(1)反射
可以调用类的私有构造
(2)反序列化
可以把字节数组还原成对象,也可以存到磁盘上,读一次生成一个对象。