设计模式【单例模式】

Java中单例模式是一种常见的设计模式,单例模式分为:饿汉式单例模式、懒汉式单例模式、登记式单例模式、枚举式单例模式。作为对象的常见模式的单例模式,确保某一类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式的特点:

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

举例说明:在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

【转载使用,请注明出处:http://blog.csdn.net/mahoking

饿汉式单例模式用例:

/**
 * 饿汉式单例类
 * @author Mahc
 *
 */
public class EagerSingleton {

	private static EagerSingleton instance = new EagerSingleton();

	/**
	 * 私有的构造方法/构造函数
	 */
	private EagerSingleton(){}

	/**
	 * 静态工厂方法
	 * @return instance
	 */
	public static EagerSingleton getInstance(){

		return instance;
	}
}

饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,在未使用时,就已经创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。

懒汉式单例模式用例:

/**
 * 懒汉式单例类
 * @author Mahc
 *
 */
public class LazySingleton {

	private static LazySingleton instance = null;

	/**
	 * 私有的构造方法/构造函数
	 */
	private LazySingleton(){}

	/**
	 * 静态工厂方法
	 * 由于懒汉式的实现是线程安全的 ,所以使用了   synchronized
	 * @return instance
	 */
	public synchronized static LazySingleton getInstance() {
		if(instance == null){
			instance = new LazySingleton();
		}
		return instance;
	}

}

懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。

由于懒汉式的实现是线程安全的,这样会降低整个访问的速度,而且每次都要判断,所以需要更好的实现方式。

登记式单例模式用例:

/**
 * 登记式单例类
 * 类似Spring里面的方法,将类名注册,下次从里面直接获取。
 * @author Mahc
 *
 */
public class RegisterSingleton {

	private static Map<String, RegisterSingleton> map = new HashMap<String, RegisterSingleton>();
	static{
		RegisterSingleton singleton = new RegisterSingleton();
		map.put(singleton.getClass().getName(), singleton);
	}

	protected RegisterSingleton(){}

	/**
	 * 静态工厂方法,返还此类惟一的实例
	 * @param name
	 * @return
	 */
	public static RegisterSingleton getInstence(String name){

		if(name == null){
			name = RegisterSingleton.class.getName();
		}
		if(map.get(name) == null){
			try {
				map.put(name, (RegisterSingleton)Class.forName(name).newInstance());
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
		return map.get(name);
	}

}

登记式单例模式,使用Class加载器,辅助Map对象将Singleton的name作为key值保存Value(Singleton的实例对象)。

本例使用枚举的关键字 enum 枚举式单例模式用例:

public enum EnumSingleton {

	/**
     * 定义一个枚举的元素,它就代表了Singleton的一个实例。
     * @author Mahc
	 */
	uniqueInstance;

}

测试各种样式的单例模式测试类:

public class TestSingleton {

	public static void main(String[] args) {

		//测试饿汉式模式
		EagerSingleton eagerSingleton01 = EagerSingleton.getInstance();
		EagerSingleton eagerSingleton02 = EagerSingleton.getInstance();
		if(eagerSingleton01 == eagerSingleton02){
			System.out.println("EagerSingleton\n" + true);
		}

		//测试懒汉式模式
		LazySingleton lazySingleton01 = LazySingleton.getInstance();
		LazySingleton lazySingleton02 = LazySingleton.getInstance();
		if(lazySingleton01 == lazySingleton02){
			System.out.println("LazySingleton\n" + true);
		}

		//测试登记式模式
		RegisterSingleton registerSingleton01 = RegisterSingleton.getInstence(null);
		RegisterSingleton registerSingleton02 = RegisterSingleton.getInstence(null);
		if(registerSingleton01 == registerSingleton02){
			System.out.println("RegisterSingleton\n" + true);
		}

		//枚举式模式
		EnumSingleton enumSingleton01 = EnumSingleton.uniqueInstance;
		EnumSingleton enumSingleton02 = EnumSingleton.uniqueInstance;
		if(enumSingleton01 == enumSingleton02){
			System.out.println("EnumSingleton\n" + true);
		}
	}

}

【转载使用,请注明出处:http://blog.csdn.net/mahoking

时间: 2024-12-25 08:08:36

设计模式【单例模式】的相关文章

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

Android 设计模式-单例模式

Android 设计模式-单例模式 什么情况下需要单例模式? 一些类提供公共功能供别人调用,本身不会处理业务逻辑 类会被许多类和线程调用 设计单例模式 public class Singleton{ private static Singleton mSingleton; private Singleton(){ } public static Singleton getInstance(){ if(mSingleton == null){ mSingleton = new Singleton(

设计模式--单例模式(学习笔记)

定义:      单例模式:保证一个类只有一个实例,并且提供一个访问它的全局访问点.(<大话设计模式定义>): 单例模式分为两种: 1>饿汉式单例类:自己被加载时就将自己实例化. 例子:       private SingleExample() {           } private static SingleExample singleExample=new SingleExample(); @Override protected SingleExample getInstanc

简易的设计模式——单例模式

定义 单例模式是一种保证一个类中只有一个实例对象的软件设计模式.它需要确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这个还是比较好理解的,一个国家只能有一个国王,不可以出现第二个,所有的人都只能来膜拜这个伟大的国王. 下面直接上代码. 实现 国王类 public class King { //确保只有一个国王 private static final King king=new King(); //保证不再产生新的国王了 private King(){} //这个国家的人通过

Java设计模式の单例模式

-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱汉式,非线程安全 c.饱汉式,线程安全简单实现 d.线程安全 并且效率高  单例模式最优方案 3.总结 a.使用枚举的单例模式 b.使用枚举,static处调用,初始化一次 -------------------------------------------------- 1.定义 确保一个类只有

c#设计模式-单例模式(面试题)

c#设计模式-单例模式 单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题, public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _in

设计模式--单例模式之Lock

1.为什么用Lock及关键知识 当我们使用线程的时候,效率最高的方式当然是异步,即个个线程同时运行,其间互不依赖和等待.当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源在同一时刻只能被同一个线程操作,以确保每个操作都是有效即时的,也即保证其操作的原子性.lock是C#中最常用的同步方式,格式为lock(objectA){codeB} . lock(objectA){codeB}表示意义: 1. objectA被lock了吗?没有则由我来

c#设计模式-单例模式【转】

单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题 public class Singleton { private static Singleton _instance = null; private Singleton(){} public static Singleton CreateInstance() { if(_instance == null) { _instance = new Singleton(); } return _instance; } } 第

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import