单例模式

单例模式

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的一个对象。也就是说,在整个程序空间中,改类只存在一个实例对象。

1.饿汉式单例模式
  • 私有化构造器
  • 在类的内部创建一个类的实例,且为static
  • 私有化对象,通过公共方法调用
  • 此公共方法只能通过类来调用,因为设置的是static,同时类的实例也是static

由“饿汉式”得知,因为比较饥饿,所以先将对象实例化,在设置全局静态函数获取这个对象。不需要考虑线程安全,因为在类的加载过程就创建了对象,之后不再创建。代码如下:

// SingletonHungry.java
import java.lang.String;
class SingletonHungry{
	private String Info = "饿汉式单例模式";
	// 常量实例化对象
	private static final SingletonHungry singleton = new SingletonHungry();
	// 私有构造函数,保证只有一个实例化对象
	private SingletonHungry(){}
	// 返回唯一实例化对象函数
	public static SingletonHungry getInstance(){
		return singleton;
	}
	// 返回对象信息
	public String getInfo(){
		return Info;
	}
}
// MainClass.java
public class MainClass{
	public static void main(String []args){
		// 获取第一个实例化对象
		SingletonHungry hungry1 = SingletonHungry.getInstance();
		System.out.println(hungry1.getInfo());
		
		// 获取第二个实例化对象
		SingletonHungry hungry2 = SingletonHungry.getInstance();
		System.out.println(hungry2.getInfo());
		
		// 比较两个对象是否是同一个
		if(hungry1==hungry2){
			System.out.println("两个对象是同一个实例化对象");
		}
	}
}
2.懒汉式单例模式
  • 私有化构造器

  • 创建一个私有的实例static 先不实例化 为 null

  • 通过公共方法调用 static 在方法里面进行判断,if = null,实例化; !=null 直接return

“懒汉式”,顾名思义那就是懒惰,是在需要实例化对象的时候创建,而且只创建一次,之后返回第一次创建的实例化对象。但是在“懒汉式”单例模式中要考虑线程安全,为了程序运行效率只同步创建实例化的语句,但是要进行双重检查。代码如下:

// SingletonSluggard.java
import java.lang.String;
class SingletonSluggard{
	private String Info;
	// 常量实例化对象
	private static SingletonSluggard singleton = null;
	// 私有构造函数,保证只有一个实例化对象
	private SingletonSluggard(){}
	// 返回唯一实例化对象函数
	public static SingletonSluggard getInstance(){
		// 防止多线程不同步产生多个实例化对象
		if(singleton==null){
			synchronized(SingletonSluggard.class){
				
				if(singleton==null){
					singleton = new SingletonSluggard();
					singleton.Info = "懒汉式单例模式";
				}
			}
		}
		return singleton;
	}
	// 返回对象信息
	public String getInfo(){
		return Info;
	}
}
// MainClass.java
public class MainClass{
	public static void main(String []args){
		// 获取第一个实例化对象
		SingletonSluggard sluggard1 = SingletonSluggard.getInstance();
		System.out.println(sluggard1.getInfo());
		
		// 获取第二个实例化对象
		SingletonSluggard sluggard2 = SingletonSluggard.getInstance();
		System.out.println(sluggard2.getInfo());
		
		// 比较两个对象是否是同一个
		if(sluggard1==sluggard2){
			System.out.println("两个对象是同一个实例化对象");
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值