Java 单例设计模式

前言

 单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例.这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

准备

 在讲单例设计模式之前,我们先简单了解下那什么是设计模式?
 说的通俗一点:设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
 1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。
 这 23 种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解。
 当然,软件设计模式只是一个引导,在实际的软件开发中,必须根据具体的需求来选择:

  • 对于简单的程序,可能写一个简单的算法要比引入某种设计模式更加容易;
  • 但是对于大型项目开发或者框架设计,用设计模式来组织代码显然更好

 感兴趣想要拜读这这本书的童鞋,在这里我也贴一下这本书的下载链接(不是百度云盘,速度贼快),评论后可见哦~ (づ ̄3 ̄)づ╭❤~

关于本文章

 本文章虽然命名为“Java 单例设计模式”,但是设计模式并不是 Java 的专利,它同样适用于 C++、C#、JavaScript 等其它面向对象的编程语言。
 本人能力有限,这一篇文章是自己在查阅很多资料后,结合自己的理解前提下整理的,本意在以最容易理解的言语去单例设计模式,有表述不当或遗漏之处还望大家在评论区斧正.
 Java 是典型的面向对象的编程语言,所以本文章以 Java 为基础来讲解单例设计模式,如果你不了解 Java,请猛击[我的Hexo静态博客][1]学习。

解决的问题

 解决一个类在内存只存在一个对象。

如何保证对象唯一

思路

  1. 为了避免其他程序过多建立该类对象。先禁止其他程序建立该类对象
  2. 还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象。
  3. 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式。

这三部怎么用代码体现呢?(思路、代码体现、代码是一一对应的)

  • 将构造函数私有化(这样就不能在外部new对象了,而且仅仅提供get方法访问对象)。
  • 在类中创建一个本类对象(静态私有)。
  • 提供一个方法可以获取到该对象(公共私有)。

单例设计模式的分类

  • 饿汉单例模式:静态初始化的方式是在自己被加载时就将自己实例化,所以被形象地称之为饿汉式单例模式。不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故又被称为“饿汉模式”)
  • 懒汉单例模式:要在第一次被引用时,才会将自己实例化,所以就被称为懒汉式单例模式。(先不急着实例化出对象,等要用的时候才给你创建出来。不着急,故又称为“懒汉模式”)

代码简单实现饿汉式

package cn.icnfox.Java;

public class SingleDemo {

	private int num;
	
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
        //私有化构造函数
	private  SingleDemo(){}
        //创建对象
	private static SingleDemo s = new SingleDemo();
        //静态方法返回该实例
	public static  SingleDemo getInstance()
	{
		return s;
	}
}

package cn.icnfox.Java;
//测试类
public class SingleTest {

	public static void main(String[] args) {
		
		SingleDemo s1 = SingleDemo.getInstance();
		SingleDemo s2 = SingleDemo.getInstance();

		s1.setNum(23);

		System.out.println(s2.getNum());

	}
}
//运行结果
23

简单实现懒汉式

package cn.icnfox.Java;
//对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
//定义单例,建议使用饿汉式。
public class SingleDemo2 {

	private int num;
	
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
        //创建对象
	private static SingleDemo2 s = null;
        //私有化构造函数
	private SingleDemo2(){}
        //静态方法返回该实例
	public static SingleDemo2 getInstance()
	{
		if(s==null)
		{
			synchronized(SingleDemo2.class)
			{				
				if(s==null)
					s = new SingleDemo2();
			}
		}
		return s;
	}
}


package cn.icnfox.Java;
//测试类
public class SingleTest {

	public static void main(String[] args) {
		
		SingleDemo s1 = SingleDemo.getInstance();
		SingleDemo s2 = SingleDemo.getInstance();

		s1.setNum(23);

		System.out.println(s2.getNum());

	}
}
//运行结果
23

简单实现线程安全的饿汉式

package cn.icnfox.Java;
//对象是方法被调用时,才初始化,也叫做对象的延时加载。成为:懒汉式。
//Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象。
//定义单例,建议使用饿汉式。
public class SingleDemo2 {

	private int num;
	
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	private static SingleDemo2 s = null;
	private SingleDemo2(){}
	// 静态方法返回该实例,加synchronized关键字实现同步
	public static synchronized  SingleDemo2 getInstance()
	{
		if(s==null)
		{
			synchronized(SingleDemo2.class)
			{				
				if(s==null)
					s = new SingleDemo2();
			}
		}
		return s;
	}
}


本人个人网站: https://www.icnfox.cn 欢迎来访
有任何问题可以在个人网站的评论区留言,看到就会第一时间回复 啾咪ヾ(≧▽≦*)o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值