单例模式浅析

两种单例模式的特点及利弊,以及在实际工作中为什么要使用工厂模式进行对象的创建?

工厂分为两类——懒汉工厂和饿汉工厂

1.懒汉工厂特征:构造器私有,创建一个该类类型的私有的静态的成员变量,只有一个公共方法并且设置为静态,在该公共方法里面进行判断是否已经创建该类的对象,如果没有创建就进行实例化,有的话直接返回。具体代码如下:

public class Singleton {
	private static Singleton instance;
	private Singleton() {
		System.out.println("实例化了一个新的单例");
	}
	public static Singleton getInstance() {
		if(instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

2.饿汉工厂特征:构造器私有,设置一个静态私有的对象并进行对该类进行实例化,对外提供一个公共的方法返回成员变量。具体代码如下:

public class SingletonHungry {
	private static SingletonHungry instance = new SingletonHungry();
	private SingletonHungry() {
		System.out.println("实例化了一个新的单例");
	}
	public static SingletonHungry getInstance() {
		return instance;
	}
}

两者的优劣:
懒汉模式:牺牲时间,节约空间,线程不安全(可以进行加锁解决)。

//懒汉模式通过同步解决多线程问题。
public class SingletonLazy {
	private static SingletonLazy instance;
	private SingletonLazy() {
		System.out.println("实例化了一个新的单例");
	}
	public static SingletonLazy getInstance() {
		if(instance != null) return instance;//为了增加效率,当拥有了实例后,我们直接返回实例。因为拥有了实例后,状态就跟饿汉一致了,显然不会发生线程问题。
		synchronized (SingletonLazy.class) {//因为是静态方法,所以用类做同步锁
			if(instance == null) instance = new SingletonLazy();
			return instance;
		}
	}
}

饿汉模式:牺牲空间,节约时间,线程安全。

使用原因:
1.解耦:使得创建对象和使用对象分开;
2.提高代码复用:如果某一个对象在项目中被频繁使用且创建过程比较繁琐,那我们就可以把创建对象的过程交给工厂进行创建,省时又省力,后期维护也不需要把所有的实例对象都进行维护,只需要对工厂进行维护就行了;
3.因为工厂管理了对象的创建逻辑,使用者并不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。

工厂模式适用的一些场景(不仅限于以下场景):

  1. 对象的创建过程/实例化准备工作很复杂,需要初始化很多参数、查询数据库等;
    2.类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值