03月11日 晴天 继续放弃中,爱下不下
所在培训机构有这么一个传统,午休之后到14点半上课间,有30分钟的学生演讲时间,听蔡班主的意思,演讲目的是锻炼我们口才,应对毕业后的面试。我是奇了个怪啦,班上90多号人,2天休一天来算,毕业就轮2圈,2次演讲就能锻炼口才了?估摸着我们都是演讲奇才吧。
今天轮到我演讲了,本来可以用固定主题:我的家乡,最后想想还是算了,就讲一下当初应对软考学得的设计模式:单例设计模式吧。
上台前,说不紧张还是有点假,毕竟这么多人,能讲利索就可以啦,我给自己的订的最低要求。如果能得到满堂彩,那最好,哈哈,想想就好了。
上台后,再来一次自我介绍,然后进入正题:单例设计模式讲解
我:单例设计模式,顾名思义就是一个类有且仅有一个实例对象。根据代码实现方式不同分为:饿汉式,懒汉式,静态内部类方式,枚举方式。
饿汉式:
public class Singleton {
//饿汉式单例
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
问:为啥叫饿汉呢?
答:你肚子饿了,你最想做啥,吃啊,很饿很饿时候,是不是迫不及待想去吃。饿汉式就是迫不及待想创建出一个单例出来。所以在类加载进内存马上就构建出这个唯一单例。
问:为什么使用private修饰构造器
答:单例模式,有且只有一个实例,构造器私有目的就是禁用外界对实例构建。
问:饿汉式单例模式好处是啥?
答:简单,方便,还线程安全。
懒汉式:
public class LazySingleton {
private static LazySingleton lazySingleton = null;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
问:为啥叫懒汉呢?
答:懒得动的意思啊,能不动就不动。懒汉式单例操作是在获取唯一单实例时才进行实例创建。
问:懒汉式单例模式好处是啥?
答:没啥特别的好处,硬要说就是延时实例的创建,另外操作不好,还会有线程安全问题。
问:标准的懒汉式单例模式长啥样?
答:双重检查方式
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton newInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
静态内部类:
public class Singleton {
private static class SingletonInstance{
private static final Singleton instance=new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonInstance.instance;
}
}
问:为啥叫静态内部类呢?
答:使用内部类的形式实现。
问:有啥好处啊?
答:线程安全的,有延时加载的效果,只有当调用getInstance方法时候才会加载内部类创建对象。
枚举:
public enum Singleton {
INSTANCE;
}
问:简单粗暴,这是啥原理
答:没啥原理,枚举定义出来后,实例个数就固定了,如果约定它实例只有1个,那就是单例啦
问:有啥好处啊?
答:线程安全,调用效率高,可以天然的防止反射和反序列化调用
问:反射跟反序列是啥
答:我也不知道,后面会学
综合看,推荐使用静态内部的方式,贪方便,就使用枚举方式。
一曲终了,附和者甚少,唉,这该死的孤独~