目录
单例模式的要点:
1、某个类只能有一个实例 2、必须自行创建实例 3、提供一个静态的公有方法用提供这个实例
单例模式的实现:
1、只提供私有的构造方法 2、含有一个该类的静态私有对象 3、必须自行向整个系统于创建、获取静态私有对象
单例模式分为两种,即饿汉式和懒汉式。
饿汉式
public class SingletonLazy {
// 饿汉式
//1、创建类中私有构造
private SingletonLazy() {}
//2、创建该类型的私有静态实例
private static SingletonLazy instance = new SingletonLazy();
//3、创建公有静态方法返回静态实例对象
public static SingletonLazy getInstance() {
return instance;
}
}
懒汉式
// 懒汉式;类内实例对象创建时并不直接初始化,
// 直到第一次调用getInstance方法时,才完成初始化操作。
public class SingletonHungry {
// 懒汉式
//1、创建私有构造方法
private SingletonHungry() {}
//2、创建静态的该类实例对象
private static SingletonHungry instance = null; // 不用空间就不会产生损耗;
//3、创建开放的静态方法提供实例对象
public static SingletonHungry getInstance() {
if (instance == null)
instance = new SingletonHungry();
return instance;
}
}
测试懒汉式和饿汉式的单例模式
public class SingletonTest {
public static void main(String[] args) {
// 测试饿汉式
// 获取单例懒汉式的实例
SingletonLazy lazyInstance = SingletonLazy.getInstance();
SingletonLazy lazyInstance1 = SingletonLazy.getInstance();
// 打印地址信息,如果两者地址信息一致,则测试成功.
System.out.println(lazyInstance);
System.out.println(lazyInstance1);
System.out.println("我是不重要的分割线=====================");
// 测试懒汉式
// 获取单例饿汉式的实例
SingletonHungry hungryInstance = SingletonHungry.getInstance();
SingletonHungry hungryInstance2 = SingletonHungry.getInstance();
// 打印地址信息,如果两者地址信息一致,则测试成功.
System.out.println(hungryInstance);
System.out.println(hungryInstance2);
}
}
测试结果:
example.singleton.SingletonLazy@5caf905d
example.singleton.SingletonLazy@5caf905d
我是不重要的分割线=====================
example.singleton.SingletonHungry@27716f4
example.singleton.SingletonHungry@27716f4
可以看到以上的地址信息式包名加类名再加上at符号和一串16进制数字组成,运行结果是正确的。
分析懒汉式和饿汉式的优劣:
* 饿汉式,空间换时间;懒汉式,时间换空间;
* 饿汉式线程安全,空间换时间,第一次运行块;
* 懒汉式存在线程风险,时间换空间,第一次运行慢;
*当多个线程并发操作,由于饿汉式在类加载时对象就被实例化创建,
线程的访问对象都是唯一的。所以线程安全。
* 而懒汉式由于线程的时间片切换,存在线程风险。
分析单例模式的优劣:
* 优点: * 1、在内存中只有一个对象,节省内存空间; * 2、避免频繁的创建销毁对象,提高性能; * 3、避免对共享资源的多重占用; * 缺点: * 1、扩展比较困难; * 2、如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失;
单例模式的使用场景:
* 1、创建对象时占用资源过多,但同时又需要用到该类对象; * 2、对系统内资源要求统一读写,如读写配置信息; * 3、当多个实例存在可能引起程序逻辑错误,如号码生成器;
其他模式
创建型模式:关注对象创建过程的的设计模式; 结构型模式:关注类和对象组合的设计模式; 行为型模式:关注对象间的通信过程的设计模式; 创建型模式 结构型模式 行为型模式 工厂方法模式 桥接模式 装饰器模式 备忘录模式 状态模式 建造者模式 代理模式 组合模式 解释器模式 模板方法模式 抽象工厂模式 享元模式 命令模式 适配器模式 访问者模式 原型模式 外观模式 中介者模式 迭代子模式 单例模式 观察者模式 责任链模式 策略模式
引用请注明出处,谢谢!