Java的设计模式总体分为三大类
创建型模式:
工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式:
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式:
策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
一、单例模式
单例模式分为懒汉式和饿汉式
饿汉式:
在声明对象时就初始化,饿汉式天生线程安全,类加载的时候初始化一次对象,效率比懒汉式要高。
public class SingleTon {
//定义私有构造方法
private SingleTon(){
}
//饿汉式 类加载的时候就进行初始化
private static final SingleTon single = new SingleTon();
public static SingleTon getInstance(){
return single;
}
}
懒汉式:
在静态方法中进行初始化,懒汉式线程不安全,需要加同步锁,同步锁影响执行效率
public class SingleTon {
//定义私有构造方法
private SingleTon2(){
}
//懒汉式 双重校验保证线程安全 使用volatile可以保证指令重排序
private volatile static SingleTon singleTon = null;
public static SingleTon getInstance(){
if (singleTon==null){
synchronized (SingleTon.class){
if (singleTon==null){
singleTon = new SingleTon();
}
}
}
return singleTon;
}
}
对于单例模式的理解
- 在单例模式中单例类只能有一个实例,其中单例模式中的构造方法必须为私有,目的是防止外部去创建。
- 既然不是通过外部去实例化,那么只能在本类中创建对象,并且必须设计为私有的。
- 但是如果外部类要去访问这个实例对象,在本类中必须有一个方法可以供外部访问。
- 单例类可以设计为final,目的在于不能被子类继承。
单例模式的饿汉式:
- 对于饿汉式式来说是不存在多线程的问题,这也是单例模式的优点。
- 但是对于饿汉式式来说,在类加载的时候静态代码就会被初始化,因此在类加载时就会创建实例对象,并且分配内存空间,不管这个对象要不要使用都会占据内存空间。
单例模式的懒汉式:
- 对于懒汉式,在类加载的时候虽然也会创建对象,但是将对象设为null,因此并不会占用内存,当调用getInstance方法时才会被初始化实例对象。
- 但是这样的方式也会存在多线程问题,因此通过使用volatile以及synchronized关键加锁来解决懒汉式多线程问题。