定义:设计模式是一套代码设计经验总结。
目的:为了代码可重用性,可靠性。
常用模式
- 创建型:工厂、抽象工厂、单例、建造者、原型
- 结构型:适配器、装饰器、代理、外观、桥接、组合、享元
- 行为型:策略、模板方法、观察者、迭代子、责任链、命令、备忘录、状态、访问者、中介、解释器
常用模式详解
1、单例模式
活动的单例只有一个实例,确保所有对象都访问同一个实例;
实现方式 | 优点 | 缺点 |
---|---|---|
懒汉式(线程不安全) | 实现简单 | 不支持多线程 |
懒汉式(线程安全) | 第一次调用才初始化,避免内存浪费 | 加锁影响效率 |
饿汉式 | 支持多线程,没有加锁,执行效率高 | 类加载时就初始化,浪费内存;容易产生垃圾对象 |
双检锁 | 采用双锁机制,在多线程情况下保持高性能 | 实现较为复杂 |
静态内部类 | 实现简单;能够达到双检锁一样的功能 | 只适用于静态域情况 |
枚举 | 实现单例模式的最佳方法,简洁;自动支持序列化机制,防止多次实例化 | 不能通过 reflection attack 来调用私有构造方法 |
- 饿汉式
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){};
public static Singleton getInstance(){
return instance;
}
}
访问方式
Singleton instance = Singleton.getInstance();
- 双检锁
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){}
public static Singleton getSingleton(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
访问方式
Singleton instance = Singleton.getInstance();
- 枚举
public enum SingletonEnum{
instance;
private SingletonEnum(){}
public void method()
}
}
访问方式
SingletonEunm.instance.method();
2、抽象工厂模式
围绕超级工厂创建其他工厂。就是提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
3、代理模式
一个类代表另一个类的功能,具体是创建具有现有对象的对象,以便向外界提供功能接口。
- 使用场景:远程代理,虚拟代理等
4、观察者模式
对象间存在一对多关系时,即当一个对象被修改时,所有依赖对象得到通知并自动更新。