设计模式系列1:单例模式
设计模式系列1:单例模式
强子哥哥 发表于4年前
设计模式系列1:单例模式
  • 发表于 4年前
  • 阅读 197
  • 收藏 6
  • 点赞 0
  • 评论 0

单例模式,指某个类只能产生一个且仅仅产生一个实例。

技术上如何实现:将构造函数声明为private.

然后通过它的一个方法返回一个实例,这样的话

程序中只要使用到这个类的实例肯定就是同一个实例。

这个应该是最简单的模式了。

直接上代码:

class Emperor {
	
	//声明为静态的类关联而非对象关联
	private static final Emperor emperor = new Emperor();
	
	private Emperor() {
		//声明为私有,不容许外部通过new来创建一个实例
	}
	
	public void setTask() {
		System.out.println("我是皇帝XXX");
	}
	
	public static Emperor getInstance() {
		//这个方法用来返回全局唯一的实例
		return Emperor.emperor ;
	}
}

public class SingletonPattern {

		public static void main( String[] args) {
			System.out.println("马年快乐...");
			Emperor e = Emperor.getInstance() ;
			e.setTask();
		}
}


运行结果:

马年快乐...
我是皇帝XXX


单例模式的定义:

Ensure a class has only one instance , and provide a global point of access to it.

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式通用代码
public class Singleton {
	private static final Singleton singleton = new Singleton();
	private Singleton(){
		
	}
	
	public static Singleton getSingleton(){
		return singleton;
	}
	
	//类中其它方法,尽量是static
	public static void doSomething()
	{
		
	}
}


一种非线程安全的单例模式

public class Singleton{
	private static Singleton singleton = null;
	private Singleton(){
		
	}
	public static Singleton getSingleton(){
		if(singleton ==null){
			singleton = new  Singleton();
		}
		return singleton;
	}
}


扩展的多例模式:

在类的static块中
static {
//创建多个实例
}

public Singleton getInstance(){
 //随机抽取一个
}


再来看看Hadoop中的单例模式

public class NullWritable implements Writable {

  private static final NullWritable THIS = new NullWritable();

  private NullWritable() {}                       // no public ctor//单例模式

  /** Returns the single instance of this class. */
  public static NullWritable get() { return THIS; }

  public void readFields(DataInput in) throws IOException {}
  public void write(DataOutput out) throws IOException {}
}


hadoop中的一个懒汉方式创建资源

private synchronized Properties getProps() 
  {
	  
    if (properties == null) {
    	
      Properties newProps = new Properties();
      loadResources(newProps, defaultResources, false, false);
      loadResources(newProps, finalResources, true, true);
      properties = newProps;
    }
    return properties;
  }


这里加了synchronized保证线程安全,这里保证一个类对象里只会生成一个properties对象,否则多线程情况下会造成初始化多个资源而只有1个赋值成功。

共有 人打赏支持
强子哥哥
粉丝 825
博文 691
码字总数 710711
作品 7
×
强子哥哥
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: