饿汉式
package cn.tedu.design;
public class Singleton1 {
public static void main(String[] args) {
//4.创建main()进行测试
// new MySingle();//不能直接创建本类对象
MySingle single1 = MySingle.getSingle();
MySingle single2 = MySingle.getSingle();
//6.测试获取到的对象是否相等
System.out.println(single1 == single2);//true
System.out.println(single1);//cn.tedu.design.MySingle@677327b6
System.out.println(single2);//cn.tedu.design.MySingle@677327b6
}
}
//0.创建自己的单例程序
class MySingle{
//1.提供构造方法,并且将构造方法私有化
private MySingle(){
}
//2.创建本类对象,并把本类对象也私有化
//5.2创建出来的对象也需要改成静态的,因为getSingle()是静态的,静态只能调用静态
private static MySingle single = new MySingle();
//3.需要给外界提供一个公共的全局访问点
//5.1需要将本方法设置成静态,这样就可以通过类名直接调用,不用通过对象来调用
public static MySingle getSingle(){
//4.将本类刚刚创建的对象通过return关键字返回调用位置
//如果一个方法设置了返回值类型,那么这个方法必须有相同类型的返回值
return single;
}
}
懒汉式
package cn.tedu.design;
public class Singleton2 {
//5.在main()中尝试获取本类对象
public static void main(String[] args) {
MySingle2 single1 = MySingle2.getSingle2();
MySingle2 single2 = MySingle2.getSingle2();
//6.测试两个引用类型变量保存的对象的地址值是否一致
System.out.println(single1 == single2);//true
System.out.println(single1);//cn.tedu.design.MySingle2@677327b6
System.out.println(single2);//cn.tedu.design.MySingle2@677327b6
}
}
//0.创建一个自己的单例程序
class MySingle2{
//1.私有化本类的构造方法,为了防止外界直接调用本类的构造方法创建对象
private MySingle2(){
}
//2.再类的内部创建好引用类型变量(延迟加载的思想)--注意私有化
//4.2本成员方法也需要设置成静态,因为静态只能调用静态
private static MySingle2 single2;
//3.创建一个公共的方法供外界调用,用来获取本类唯一的对象
//4.1如果想绕过对象通过本类类名直接调用本方法,需要将方法设置成静态,因为静态可以被类名直接调用
public static MySingle2 getSingle2(){
//3.1在返回对象之前,需要先判断single2是否保存有地址值
if (single2 == null){//如果是默认值null,说明之前从来没有创建过本类对象
//3.2没有创建,就创建一个,并赋值给single2
single2 = new MySingle2();
}
//3.3如果跳过了if的{},说明single2不为空,有地址值,之前创建过对象
//那么就不再新建对象,而是把之前的对象返回,即可
return single2;
}
}
class MySingle3{
private MySingle3(){
}
private static MySingle3 single3;
public static MySingle3 getSingle3(){
if (single3 == null){
single3 = new MySingle3();
}
return single3;
}
}



