设计模式一
1.工厂模式
特点:子类实现接口通过名称创建对象(实例化对象),返回值为接口。
优点:根据名字创建对象
缺点:代码不是动态的,如果有新的类型,需要手动添加,增加了复杂度。
2.抽象工厂
特点:工厂方法上再多一层,工厂类通过继承重写方法。工厂创造器可以通过名字获取工厂类型。
单例模式
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
1、懒汉式,线程不安全
public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
2、懒汉式,线程安全
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
3、饿汉式
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
4、双检锁/双重校验锁(DCL,即 double-checked locking)
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
5、登记式/静态内部类
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
6、枚举
public enum Singleton { INSTANCE; public void whateverMethod() { } }
总结:
1.分清饿汉懒汉区别
2.双重检索可能造成的线程不安全优化顺序
3.难点主要在于双端检索的单例模式为了防止指令重排要加volatile关键字。