java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
懒汉式单例模式
/// <summary>
/// 懒汉式单例模式,在第一次被引用时开始实例化
/// </summary>
package zl.biz.impl;
import java.io.*;
import java.util.Properties;
/**
* 懒汉式单例模式
* @author aptech
*
*/
public class Env extends Properties{
private static Env env=null;
/**
* 构造方法
*/
private Env()
{
InputStream is=getClass().getResourceAsStream("/db.properties");// 读取配置数据库连接池文件
try {
load(is);
} catch (IOException e) {
// TODO 自动生成 catch 块
System.err.println("错误:没有读属性文件"+"请确认db.properties文件是否存在");
}
}
/**
* 同步同一个时间,只能被一个人调用(线程等待,防止同时访问时的误差)
*/
public synchronized static void getInsEnv() {
if(env==null)
{
env=new Env();
}
}
/**
* @return 返回单例模式的实例
*/
public static Env getEnv()
{
if(env!=null)
{
return env;
}else
{
getInsEnv();//调用同步
return env;
}
}
}
using System.Collections.Generic;
using System.Text;
namespace OODemo
{
/// <summary>
/// 饿汉式单例模式,在第一次加载时就实例化
/// </summary>
public class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton()
{
}
public static Singleton GetInstance()
{
return instance;
}
}
/// <summary>
3、登记式单例模式
import java.util.HashMap;
public class RegSingleton
{
static private HashMap m_registry = new HashMap();
static
{
RegSingleton x = new regSingleton();
m_registry.put(x.getClass().getName(), x);
}
protect RegSingleton(){}
static public RegSingleton getInstance(String name)
{
if(name == null )
{
name = "RegSingleton";
}
if(m_registry.get(name ) == null )
{
m_registry.put(name, Class.forName(name).newInstance();
}
catch(Exception e)
{
System.out.println("Error happened.");
}
return (RegSingleton)(m_registry.get(name));
}
}
三 种Singleton模式的比较
饿汉式 类被加载时就被实例化。
懒汉式 类加载时,不被实例化,在第一次引用时实例化。
饿汉式、懒汉式都不能被继承
而登记式可以被继承。