Java设计模式菜鸟系列(六)单例模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39784403

单例模式(Singleton):是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。好处主要有:1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

单例模式主要有两种实现方式:1、懒汉式;2、饿汉式

一、uml建模

二、代码实现:

1、懒汉式

/**
 * 示例:单例--单例对象能保证在一个JVM中,该对象只有一个实例存在。
 *
 * 缺点:这种做法在多线程环境下,不安全
 *
 * 懒汉式
 */

class Singleton {
	/**
	 * 持有私有静态变量(也称类变量),防止被引用
	 *
	 * 此处赋值为null,目的是实现延迟加载 (因为有些类比较庞大,所以延迟加载有助于提升性能)
	 */
	private static Singleton instance = null;

	/** 私有构造方法,防止被实例化 */
	private Singleton() {

	}

	/** 静态工厂方法,创建实例 --只不过这里是创建自己,而且只能创建一个 */
	public static Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}

	public void info() {
		System.out.println("this is a test method...");
	}
}

/**
 * 客户端测试类
 *
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		/**
		 * 调用普通方法
		 */
		s1.info();
		Singleton s2 = Singleton.getInstance();
		/**
		 * 运行结果为true,说明s1、s2这两个类变量都指向内存中的同一个对象
		 */
		System.out.println(s1 == s2);
	}
}

2、饿汉式

/**
 * 饿汉式
 */

class Singleton {
	private static Singleton instance = new Singleton();

	private Singleton() {

	}

	public static Singleton getInstance() {
		return instance;
	}

	public void info() {
		System.out.println("this is a test method...");
	}
}

/**
 * 客户端测试类
 *
 * @author Leo
 */
public class Test {
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		/**
		 * 调用普通方法
		 */
		s1.info();
		Singleton s2 = Singleton.getInstance();
		/**
		 * 运行结果为true,说明s1、s2这两个类变量都指向内存中的同一个对象
		 */
		System.out.println(s1 == s2);
	}

}

3、如果考虑多线程,那么getInstance()方法要加同步synchronized,这时饿汉式比懒汉式要好,尽管资源利用率要差,但是不用同步。

/**
 *
 * 考虑多线程的时候,下面这种做法可以参考一下:--懒汉式
 *
 * 在创建类的时候进行同步,所以只要将创建和getInstance()分开,单独为创建加synchronized关键字
 *
 * 这种做法考虑性能的话,整个程序只需创建一次实例,所以性能也不会有什么影响。
 *
 * @author Leo
 */
public class SingletonTest {

	private static SingletonTest instance = null;

	private SingletonTest() {
	}

	private static synchronized void syncInit() {
		if (instance == null) {
			instance = new SingletonTest();
		}
	}

	public static SingletonTest getInstance() {
		if (instance == null) {
			syncInit();
		}
		return instance;
	}
}

三、总结

单例模式保证了一个类只有一个实例,且提供一个访问全局点的方式,更加灵活的保证了实例的创建和访问约束。系统中只有一个实例,因此构造方法应该为私有 饿汉式:类加载时直接创建静态实例;懒汉式:第一次需要时才创建一个实例,那么getInstance方法要加同步 饿汉式比懒汉式要好,尽管资源利用率要差,但是不用同步。

时间: 2024-08-01 12:42:25

Java设计模式菜鸟系列(六)单例模式建模与实现的相关文章

Java设计模式菜鸟系列(八)适配器模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39805069 适配器模式(Adapter):将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题. 主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式. 一.类的适配器模式 1.uml建模: 2.代码实现 /** * 示例(一):类的适配器模式 * * 原类拥有一个待适配的方法originMethod */ class Origin

Java设计模式菜鸟系列(二)观察者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577 观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来,当一个对象改变状态时,依赖它的对象都会收到通知并自动跟新.Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体现在Observable类和Observer接口.先看uml模型图: 一.UML模型图 二.代码实现 /** 示例:咱们去菜市场买菜 * * 小商

Java设计模式菜鸟系列总结及博客全目录

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40031567 今天来对这23种设计模式做个总结.咱使用设计模式的目的是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,当然设计模式并不是万能的,项目中的实际问题还有具体分析.咱不能为了使用设计模式而使用,而是在分析问题的过程中,想到使用某种设计模式能达到咱需要的效果,而且比不使用设计模式更有优势,那么咱该考虑使用设计模式了. 一.设计模式的一般分类 创建型(Creator)模式(

Java设计模式菜鸟系列(一)策略模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563 今天开始咱们来谈谈Java设计模式.这里会结合uml图形来讲解,有对uml建模不熟的可以参考我的另一篇博文uml建模. 首先,个人觉得模式的设计就是一个将变化的东西和不变(稳定)的东西分离的过程.咱们的应用中可能有很多需要改变的地方,而模式要做的就是把它们"抽取"出来并进行"封装"和"实现",因此更多的时候咱们是面向接口编程

Java设计模式菜鸟系列(十六)原型模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39997337 原型模式(Prototype):该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.而这里的复制有两种:浅复制.深复制. 浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的. 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的.简单来说,就是深复制进行了完全彻底的复制,而浅复

Java设计模式菜鸟系列(二十一)享元模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40021651 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象.主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销.在某种程度上,你可以把单例看成是享元的一种特例. 一.uml建模: 二.代码实现 /** * 享元模式(Flyweight):运用共享的技术有效地支持大量细粒度的对象. * * 主要目的是实现对象的共享,即共享池,当系统中对象

Java设计模式菜鸟系列(十九)备忘录模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018967 备忘录模式(Memento): 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象. 一.uml建模: 二.代码实现 /** * 备忘录模式(Memento):主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象 * * 示例:原始类--> 创建.恢复备忘录 */ class Original { private String state; public Or

Java设计模式菜鸟系列(三)装饰者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39759199 装饰者(Decorator)模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更具有弹性的替代方案.对于装饰者模式,它其实是一种包装,所以我更愿意称它为一种包装.像咱们以前经常使用的Java里面的IO流就用到了装饰者模式.比如:BufferedReader br = new BufferedReader(new InputStreamReader(new Fi

Java设计模式菜鸟系列(十五)建造者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435 建造者模式(Builder):工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理.简单起见,就拿之前的工厂方法模式进行修改一下就可以得到建造者模式. 一.uml建模: 二.代码实现 /** * 示例:建造者模式 * * 与工厂模式的区别:工厂类模式提供的是创建单个类,而建造者模式则是将各种产品集中起来进行管理 */ interface Sende