`
愤怒的砖头
  • 浏览: 9787 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

浅析单例模式

 
阅读更多

浅析单例模式

单例模式(singleton pattern),简而言之就是说一个类只能生成一个实例,而这个实例将被多个对象依赖。

那么,我们平常开发的时候,都是习惯了使用new关键字创建对象,应该怎么做才能够让一个类只生成一个对象呢?大家知道,在生成一个对象的时候,我们一般都是通过类的构造方法来生成对象的,那么当这个类的构造方法被设置成private的时候,要生成这个对象,就只能通过它内部来生成了。要做到一个类只生成一个对象,正是利用了这一点。我们来看代码:

public class Singleton {
	private static Singleton singleton=null;
	
	//私有的构造方法
	private Singleton(){
		
	}
	
	//外部调用来获取实例
	public static Singleton getSingleton(){
		if(singleton==null){
			singleton=new Singleton();
		}
		return singleton;
	}
}

从上面代码可以看出,如果要产生一个单例,只需要返回这个构造方法为私有的并且在内部已经实例化的对象即可。但是,这种写法有一定的缺陷,它可能会产生线程不安全问题。举个例子,加入一个线程A执行到了singleton=new Singleton();,但是还没生成实例,而此时另外一个线程B执行到了singleton==null,条件为真,结果就产生了两个不同的对象,不过解决方法还是有的,比如可以加一个synchronized来锁住getSingleton方法,不过这种方法一般不被推荐。下面介绍一个比较安全的写法:

public class Singleton {
	private static Singleton singleton=new Singleton();
	
	//私有的构造方法
	private Singleton(){
		
	}
	
	//外部调用来获取实例
	public static Singleton getSingleton(){
		return singleton;
	}
}

这种单例又称为饿汉式单例,前者被称为懒汉式单例,这是一种比较推荐的写法,建议读者使用这种写法。

可能有人就会问,如果我想一个类生成固定数量的单例,应该怎么实现?哈哈,在这里告诉大家,这种想法确实可以实现,实现的方法呢也不难,只要在原来的基础上新增一个类属性——最多能产生的实例数量,那么基本上你就懂得如何往下写了,见代码:

import java.util.ArrayList;
import java.util.Random;

public class SingletonExpand {
	
	//最多产生的实例数量
	private static int maxNum=3;
	
	private static SingletonExpand singletonExpand=new SingletonExpand();
	
	//实例的id
	private static int id=0;
	
	//用来存放实例
	private static ArrayList<SingletonExpand> list=new ArrayList<SingletonExpand>();
	
	//私有的构造方法
	private SingletonExpand(){
		
	}
	
	static{
		for(int i=0;i<maxNum;i++){
			list.add(new SingletonExpand());
		}
	}
	
	//随机返回一个实例
	public static SingletonExpand getSingleton(){
		Random random=new Random();
		id=random.nextInt(maxNum);
		return list.get(id);
	}
}
由于一段时间没写博客了,现在花了点时间写了一个单例模式的博客,大家要多多捧场啊。大笑大笑

分享到:
评论

相关推荐

    深入Java单例模式浅析

    Java设计模式-单例模式(懒汉和恶汉)

    JS 设计模式之:单例模式定义与实现方法浅析

    本文实例讲述了JS 设计模式之:单例模式定义与实现方法。分享给大家供大家参考,具体如下: 良好的设计模式可以显著提高代码的可读性,降低复杂度和维护成本。笔者打算通过几篇文章通俗地讲一讲常见的或者实用的设计...

    浅析php单例模式

    本系列文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式之单例模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设计经验的总结。 ...

    浅析Java设计模式编程中的单例模式和简单工厂模式

    主要介绍了浅析Java设计模式编程中的单例模式和简单工厂模式,使用设计模式编写代码有利于团队协作时程序的维护,需要的朋友可以参考下

    Java中的四种单例模式浅析

    主要给大家介绍了关于Java中四种单例模式的相关资料,其中包括饿汉式、懒汉式、懒汉式(双重锁)及内部类等四种,分别给出了详细的示例代码和介绍,需要的朋友们下面来一起看看吧。

    JS 设计模式之:工厂模式定义与实现方法浅析

    浅析 JS 设计模式之:单例模式 今天来说一说一种常见的设计模式:工厂模式。 工厂模式是一种创建对象的 创建型模式,遵循 DRY(Don’t Repeat Yourself)原则。在该模式下,代码将会根据具体的输入或其他既定规则,...

    设计模式的理解浅析

    ● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;

    浅析java常用的设计模式(doc-23页).doc

    5、单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统 提供这个实例单例模式。单例模式只应在有真正的"单一实例"的需求时才可使用。 6、适配器(变压器)模式:把一个类的接口变换成客户端...

    Kotlin中单例模式和Java的对比浅析

    单例模式,一直以来是我们在日常开发中最常用的一种设计模式,更是面试中非常重要,也非常容易被问到的问题。在日常开发中,大家常用的语言还是Java,但今天我给大家带来的是在Kotlin语言中,单例模式是怎么编写的,...

Global site tag (gtag.js) - Google Analytics