Java单例模式
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
面向对象常见的23种设计模式,又可以分为以下三类:
创建型模式
1. 工厂方法模式
2. 建造者模式
3. 抽象工厂模式
4. 原型模式
5. 单例模式
结构型模式
1. 桥接模式
2. 代理模式
3. 享元模式
4. 外观模式
5. 装饰器模式
6. 组合模式
7. 适配器模式
行为型模式
1. 备忘录模式
2. 解释器模式
3. 命令模式
4. 中介者模式
5. 观察者模式
6. 策略模式
7. 状态模式
8. 模板方法模式
9. 访问者模式
10. 迭代子模式
11. 责任链模式
单例模式:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
实现方式:
只提供私有的构造方法。
含有一个该类的静态私有对象。
提供一个静态的公有方法用于创建、获取静态私有对象。
实现单例模式有两种方案:
饿汉式:对象创建过程中实例化。
懒汉式:静态公有方法中实例化。
(1)饿汉式
//饿汉式:创建对象实例的时候直接初始化 public class SingletonOne { //1.创建类中私有构造 private SingletonOne(){} //2.创建该类型的私有静态实例 //在类被加载的时候,对象就会被创建 //之后无法被创建,因此只会存在一个实例对象 private static SingletonOne instance=new SingletonOne(); //3.创建公有静态方法返回实例对象 public static SingletonOne getInstance(){ return instance; } } public class test { public static void main(String[] args){ //无法通过构造方法来创建实例对象。 //因为静态方法已经被私有化 // SingletonOne one = new SingletonOne(); //因此只能通过静态方法来获取静态对象 SingletonOne one = SingletonOne.getInstance(); SingletonOne two = SingletonOne.getInstance(); System.out.println(one.equals(two)); //true 是同一个对象 } }
无法在外部创建对象,那么就只能调用对象,因而对象只能存在一个。
(2)懒汉式
public class SingletonTwo { //1.创建私有构造方法 private SingletonTwo(){} //2.创建静态的该类实例对象 private static SingletonTwo instance=null; //3.创建开放的静态方法提供实例 public static SingletonTwo getInstance(){ if (instance==null){ instance = new SingletonTwo(); //调用的时候再进行创建 } return instance; } }
懒汉式是需要创建的时候再进行创建,饿汉式是一开始不管三七二十一就创建完毕了。
饿汉式线程安全。
懒汉式存在线程风险。解决方法:同步锁、双重校验锁、静态内部类、枚举。
单例模式
优点:
1.在内存中只有一个对象,节省内存空间。
2.避免频繁的创建销毁对象,提高性能。
3.避免对共享资源的多重占用。
缺点:
1.扩展比较困难
2.如果实例化后的对象长期不利用,系统将默认为垃圾进行回收,造成对象状态丢失。