JAVA进阶版:单例模式

文章目录

1.单例模式

*1.实现单例模式要领:

  • 1.构造方法私有化
  • 2.对外提供一个公开的静态的获取当前类型对象的方法
  • 3.提供一个当前类型的静态变量

*2.单例模式分为两种:

  • 饿汉式单例:在类加载时就创建对象。
  • 懒汉式单例:用到对象的时候才会创建对象。

(1) 相等引入单例

package javase.jingjie.DanyiMoshi;
/**
 * 单例模式是为了保证JVM中某一个类型的java对象永远只有一个,为了节省内存的开销。
 * */
public class Danyi {
	public static void main(String[] args) {
		User u1=new User();
		User u2=new User();	
		//两边如果是基本数据类型,可以比较这两个基本数据类型是否相等;
		//两边如果是引用数据类型,则比较的是内存地址。
		System.out.println(u1==u2);//false
	}
}
package javase.jingjie.DanyiMoshi;
public class User {
}

(2) 懒汉式单例模式

package javase.jingjie.DanyiMoshi;
public class Singleton {//懒汉式单例模式
	
	//静态变量,会默认赋值为null,只在本类中访问
	private static Singleton s;
	//将构造方法私有化
	private Singleton() {
		
	}
	//对外提供一个公开获取Singleton对象的方法
	public static Singleton getInstance() {
		//逻辑语言控制机制
		if(s==null) {
			s=new Singleton();//这里s指向15行中静态变量
		}
		return s;
	}
}

测试:

package javase.jingjie.DanyiMoshi;

public class Test01 {
	public static void main(String[] args) {
		/*
		 * //两次new就是创建了两个对象空间,还是不能实现单例模式 
		 * System.out.println(new Singleton()==new Singleton());//false 
		 * //还是不能实现单例模式 
		 * Singleton s1=new Singleton(); 
		 * Singleton s2=new Singleton(); 
		 * System.out.println(s1==s2);//false
		 */	
		//类名.访问
		Singleton s1=Singleton.getInstance();
		Singleton s2=Singleton.getInstance();
		Singleton s3=Singleton.getInstance();
		//说明s1==s2==s3,对象的内存地址一致,只有一个对象,构成单例模式
		System.out.println(s1==s2);//true,
		System.out.println(s2==s3);//true,
	}
}

(3) 饿汉式单例模式

package javase.jingjie.DanyiMoshi;
/**
 * 饿汉式单例模式
 * */
public class Customer {
//类加载时只执行一次
	private static Customer c=new Customer();
	//构造方法私有化
	private Customer() {}
	//提供公开的方法
	public static Customer getInstance() {
		return c;
	}
}

测试:

package javase.jingjie.DanyiMoshi;
public class Test02 {
	public static void main(String[] args) {
		Customer c1=Customer.getInstance();
		Customer c2=Customer.getInstance();
		System.out.println(c1==c2);//true	
	}
}

发布了71 篇原创文章 · 获赞 10 · 访问量 3417

猜你喜欢

转载自blog.csdn.net/JH39456194/article/details/104076712