单例设计模式
1.概念
1.什么是单例模式
- 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
- 单例模式有两种方式:
- 饿汉式
- 懒汉式
2.饿汉式设计模式
1.步骤
-
构造器私有化
-
类的内部创建对象
-
向外暴露一个静态的公用方法 getInstance()
-
饿汉式可以造成创建对象没有被使用
public class SinleTon { public static void main(String[] args) { GirlFriend girlFriend = GirlFriend.getInstance(); System.out.println(girlFriend.toString());// 小婉 // 类的加载,静态变量初始化,只会执行一次 System.out.println(GirlFriend.getInstance() == (GirlFriend.getInstance()));// true } } class GirlFriend{ private String name; //2.在类的内部直接创建 private static GirlFriend gf = new GirlFriend("小婉"); //1.构造器私有化 private GirlFriend(String name) { this.name = name; } //3.提供一个公共的static方法 返回gf对象 public static GirlFriend getInstance(){ return gf; } @Override public String toString() { return "GirlFriend{" + "name='" + name + '\'' + '}'; } }
3.懒汉式设计模式
1.步骤
-
构造器私有化
-
类的内部创建对象
-
向外暴露一个静态的公用方法 getInstance()
public class SingleTon { public static void main(String[] args) { System.out.println(Cat.getInstance().toString());//喵喵 //懒汉式,只有当用户调用时才会创建;用户再次调用时,直接返回之前创建的 System.out.println(Cat.getInstance() == Cat.getInstance()); //true } } class Cat{ private String name; private static Cat cat; public Cat(String name) { this.name = name; } public static Cat getInstance(){ if (cat == null){ cat = new Cat("喵喵"); } return cat; } @Override public String toString() { return "Cat{" + "name='" + name + '\'' + '}'; } }
4.饿汉式与懒汉式模式
- 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用是才创建
- 饿汉式不存在线程安问题,懒汉式存在线程安全问题
- 饿汉式存在浪费资源的可能,如果程序员一个对象实例都没使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题