单例设计模式小白逐步分析

xiaoxiao2021-03-01  51

1、

package com.test.singleinstance; class SingleInstance{ } public class SingleInstanceTest { public static void main(String[] args) { // 如果可以使用外部类new的方式new对象,则构造方法一定是public的 // 这样外部类就可以无限次的new新对象,不满足单例设计的要求 SingleInstance s1 = new SingleInstance(); SingleInstance s2 = new SingleInstance(); if(s1 == s2) { System.out.println("是同一个对象"); } else { System.out.println("不是同一个对象"); } } } 结果为:不是同一个对象2、 package com.test.singleinstance; class SingleInstance{ // 单例的前提是将构造方法私有化 private SingleInstance() { } // 如果期望外部类调用此方法获得本类对象且此方法不是static的话, // 则外部类需要new一个新的对象然后去调用此方法,但与本类的构造方法为private相冲突 // 所以此方法必须为static方法 public static SingleInstance getSingleInstance() { return new SingleInstance(); } } public class SingleInstanceTest { public static void main(String[] args) { SingleInstance s1 = SingleInstance.getSingleInstance(); SingleInstance s2 = SingleInstance.getSingleInstance(); if(s1 == s2) { System.out.println("是同一个对象"); } else { System.out.println("不是同一个对象"); } } } 结果为:不是同一个对象

3、//饿汉模式

class SingleInstance{ // 在全局new一个对象 private static SingleInstance singleInstance = new SingleInstance(); private SingleInstance() { } //无论如何调用本方法,都返回的是同一个全局对象 public static SingleInstance getSingleInstance() { return singleInstance; } } // 懒汉模式 class SingleInstance2{ // 注意此处变量为null private static SingleInstance2 singleInstance = null; private SingleInstance2() { } public static SingleInstance2 getSingleInstance() { // 如果本类的对象不存在,在进行new对象,如果存在,就不进行次操作,如此便保证了对象的单例 if(singleInstance != null) { singleInstance = new SingleInstance2(); } return singleInstance; } } public class SingleInstanceTest { public static void main(String[] args) { // 饿汉模式测试 SingleInstance s1 = SingleInstance.getSingleInstance(); SingleInstance s2 = SingleInstance.getSingleInstance(); if(s1 == s2) { System.out.println("是同一个对象"); } else { System.out.println("不是同一个对象"); } // 懒汉模式测试 SingleInstance2 s3 = SingleInstance2.getSingleInstance(); SingleInstance2 s4 = SingleInstance2.getSingleInstance(); if(s3 == s4) { System.out.println("是同一个对象"); } else { System.out.println("不是同一个对象"); } } } 结果为:是同一个对象        是同一个对象
转载请注明原文地址: https://www.6miu.com/read-3200074.html

最新回复(0)