文章目录
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
}
}