装饰器模式
动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案
代理模式控制对象的访问
装饰者模式为对象增加行为,而代理模式是控制对象的访问。
适配器模式会改变对象适配的接口,而代理模式则实现相同的接口。
宗旨
如果我们在程序启动后,一定会加载到类,那么用饿汉模式实现的单例 简单又实用;如果我们是写一些工具类,则优先考虑使用懒汉模式,因为很多项目可能会引用到 jar 包,但未必会使用到这个工具类,懒汉模式实现的单例可以避免提前被加载到内存中,占用系统资源。
反射可以使用私有构造函数、
反射、clone 会破坏传统的方式
饿汉
// 饿汉模式
public final class Singleton {
private static Singleton instance=new Singleton();// 自行创建实例
private Singleton(){}// 构造函数
public static Singleton getInstance(){// 通过该函数向整个系统提供实例
return instance;
}
}
懒汉 — 静态内部类实现
// 懒汉模式 内部类实现
public final class Singleton {
public List<String> list = null;// list 属性
private Singleton() {// 构造函数
list = new ArrayList<String>();
}
// 内部类实现
private static class InnerSingleton {
private static Singleton instance=new Singleton();// 自行创建实例
}
public static final Singleton getInstance() {
return InnerSingleton.instance;// 返回内部类中的静态变量
}
}
枚举
Java虚拟机会保证枚举类型不能被反射 并且构造函数只被执行一次;
package wu.wl.signgle;
public class Singleton {
private Singleton(){
}
public static enum SingletonEnum {
SINGLETON;
private Singleton instance = null;
private SingletonEnum(){
instance = new Singleton();
}
public Singleton getInstance(){
return instance;
}
}
public static void main(String[] args) {
Singleton one = SingletonEnum.SINGLETON.getInstance();
Singleton two = SingletonEnum.SINGLETON.getInstance();
System.out.println(one == two);
}
}