一、什么是单例模式
通过单例模式的方法创建的类在当前进程中只有一个实例,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
二、实现步骤
- 构造器私有化,防止被直接创建对象
- 类的内部创建对象
- 向外实现一个静态公共方法可以调用
二、饿汉式单例
- 饿汉式概念:饿汉式在一开始类加载的时候就已经实例化,并且创建单例对象,以后只管用即可
- 饿汉式实现:
public class text { public static void main(String[] args) { //通过方法可以获取对象 GirlFriend instance = GirlFriend.getInstance(); System.out.println(instance); GirlFriend instance2 = GirlFriend.getInstance(); System.out.println(instance2); System.out.println(instance.equals(instance2)); } } class GirlFriend { private String name; //饿汉式可能造成创建了对象,但是沒有使用. //在 private static GirlFriend gf = new GirlFriend("小美"); public static int n1 = 100; //1. 将构造器私有化 //2. 在类的内部直接创建对象(该对象是 static) //3. 提供一个公共的 static 方法,返回 gf 对象 private GirlFriend(String name) { System.out.println("构造器被使用."); this.name = name; } public static GirlFriend getInstance() { return gf; } @Override public String toString() { return "GirlFriend{" + "name='" + name + '\'' + '}'; } }
小结:将构造器进行私有化,防止new出多个对象,在本类的内部进行new一个对象并用static修饰,并编写一个getInstance()方法返回对象引用,此时在外部可以直接使用类名.getInstance()的方式调用方法,而调用静态方法的同时会使类进行加载,而加载类的同时会将static修饰的属性和方法初始化,从而达到一个单例对象的效果,类加载时就创建了对象,线程安全,但使用static属性 n1 时也会创建对象,存在资源浪费的可能
三、懒汉式单例
- 懒汉式概念:懒汉式一开始不会实例化,什么时候用就什么时候new,才进行实例化
- 懒汉式实现:
public class text { public static void main(String[] args) { //System.out.println(Cat.n1); //此时只执行Cat的静态属性不会创建出对象,构造器 //不会被调用 Cat instance = Cat.getInstance(); System.out.println(instance); Cat instance2 = Cat.getInstance(); System.out.println(instance2); System.out.println(instance == instance2);//T } } class Cat { private String name; public static int n1 = 999; private static Cat cat ; //默认是 null private Cat(String name) { System.out.println("构造器调用..."); this.name = name; } public static Cat getInstance() { if(cat == null) { //如果还沒有创建 cat cat = new Cat("小可愛"); } return cat; } @Override public String toString() { return "Cat{" + "name='" + name + '\'' + '}'; } }
小结:将构造器进行私有化,防止new出多个对象,在本类的内部定义一个Cat对象,默认是为null此时并未初始化,当用户使用其他静态属性或方法造成类的加载并不会使cat对象创建,当调用getInstance()方法时,会进行一个if判断语句,假如还未初始化就进行初始化,并返回对象,懒汉式不存在资源浪费问题,但存在线程安全问题