其他分享
首页 > 其他分享> > 单例模式

单例模式

作者:互联网

1.单例设计模式定义

保证一个类只有一个实现类,并且提供她的全局访问点,

2.分析单例模式实现过程

由于一个类定义后,类的构造方法是共有的所以程序员可以随便new出多个实例,也就是说类的外部可以通过构造方法来创建任意多个实例。所以要想实现单例的思想,就必须要把狗崽方法的权限收回来,,让类自己来管理实例的传建工作,让后由本类提供外部可以访问的方法。

3.单例模式分类

单例模式下还有两种实现单例的方式,分别是懒汉式实现和饿汉式实现,下面用代码说明不同。
懒汉式:

/**
 * @author chunchun
 *@date 2021年1月4日
 * @projectname Design_pattern
 * 懒汉式单例模式
 */
public class Singletom {
	private String dataString; 
	
	//电脑椅一个变量处处创建好的类实例
	private static Singletom uniqueInstance = null;
	///私有化构造函数,可以内部去控制创建实例的数目
	private Singletom() {
	//
	}
	//定义一个客户端提供实例
	public static synchronized Singletom getInstance() {
		
		//判断存储实例的变量是否有值
		if(uniqueInstance == null) {
			uniqueInstance = new Singletom();
		}
		//有值就直接使用
		return uniqueInstance;
	}
	public String getSingleyonData() {
		return dataString;
	}
	
}

饿汉式:

package singalton;


/**
 * @author chunchun
 *@date 2021年1月4日
 * @projectname Design_pattern
 * 饿汉式单例模式
 */
public class Singletom2 {
	private String dataString; 
	
	//定义一个类实例
	private static Singletom2 uniqueInstance = new Singletom2();
	///私有化构造函数,可以内部去控制创建实例的数目
	private Singletom2() {
		
	}
	//定义一个客户端提供实例
	public static  Singletom2 getInstance() {
		//返回实例
		return uniqueInstance;
	}
	public String getSingleyonData() {
		return dataString;
	}
	
}

懒汉式和饿汉式去别就是一个是懒汉式是在客户端需要的时候才实例化对象,而饿汉式式在装载类的时候就创建好实例.

4,通过一个实例加深理解

下面我们模拟一个框架加载配置文件时候使用单例模式来实现读取配置文件。

/**
 * @author chunchun
 *@date 2021年1月4日
 * @projectname Design_pattern
 * 饿汉式单例设计模式
 * 读取应用配置文件
 */
public class AppConfig2 {
	//定义一个变量来存储创建好的实例,直接在这里创建类的实例,只能创建一次
	private  static AppConfig2 instance = new AppConfig2();
	
	//存储配置文件参数A的值
	private String  paramterA;
	//存储配置文件参数B的值
	private String paramterB;
	//定义一个客户端提供AppConfig2实例
	public static AppConfig2 getInstance() {
		return instance;
	}
	
	public String getParamterA() {
		return paramterA;
	}
	public void setParamterA(String paramterA) {
		this.paramterA = paramterA;
	}
	public String getParamterB() {
		return paramterB;
	}
	public void setParamterB(String paramterB) {
		this.paramterB = paramterB;
	}
	public AppConfig2() {
		//调用读取配置文件的方法
		readConfig();
	}
	private void readConfig() {
		
		Properties p = new Properties();
		InputStream in = null;
		try {
			in = AppConfig2.class.getResourceAsStream("AppConfig.properties");
			p.load(in);
			//把配置文件的内容读取到类
			this.paramterA = p.getProperty("paramA");
			this.paramterB = p.getProperty("paramB");
		}catch (IOException e) {
			System.out.println("装载配置文件错误");
			e.printStackTrace();
		}finally {
			try {
				in.close();
			}catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		AppConfig2 config = new AppConfig2();
		String paramA= config.getParamterA();
		String paramB = config.getParamterB();
		System.out.println("使用AppConfig2实现"+paramA+paramB);
	}
}

配置文件AppConfig .properties 文件截图如下;
在这里插入图片描述

5下面总结一下懒汉式和饿汉式的实现步骤

懒汉式:
1)私有化构造方法

private Singleton(){}

2)提供获取实例的方法

public static synchronized Singletom getInstance() {
		
		//判断存储实例的变量是否有值
		if(uniqueInstance == null) {
			uniqueInstance = new Singletom();
		}
		//有值就直接使用
		return uniqueInstance;
	}
```3)把实现编程静态的

private static Singletom uniqueInstance = null;

完整实例如上。
饿汉式
1)new出静态实例

private static Singletom2 uniqueInstance = new Singletom2();

2)提供放回实例方法

public static Singletom2 getInstance() {
//返回实例
return uniqueInstance;
}

#####  6 .在学习单例模式的时候其实透露出了缓存的实现思想
有代码经验的知道,假如数据存储在数据库每次要是用的都去数据库查找数据,如果要频繁使用就得频繁到数据库进行查找操作,这样会很耗费系统资源,也浪费时间,所以有了缓存这种技术。
简单来说韩存就是把一些数据存到内存里,每次进行操作的时候先到内存查找如果没有再去获取她,获取到还要把它设置到缓存里,这样下次访问就可以在内存里获取它。这样就可以节省大部分时间。其实缓存就是用空间换时间的典型方式。
那为什么说单例模式体现 了缓存的思想,其实在懒汉式里的外部调用方法(也就是getInstance)方法下的if 判断instance是否有值如果 没有就获取一个,如果有就直接使用而private static Singerton instance = null; 就是用来实现缓存的。
对缓存韩兴趣的 同学可以查阅缓存实现方面的资料。

标签:String,private,uniqueInstance,实例,模式,单例,public
来源: https://blog.csdn.net/qq_44550513/article/details/112220284