`

单例模式及其扩展

阅读更多

设计模式之禅学习——单例模式

 

1、单例模式应该是设计模式最简单的一种了,我认为,单例模式最基本的原理就是创建一个私有的构造函数,然后在该类中就生成一个该类的实例,并且通过一个静态方法返回该实例,那么当其他类应用该类时,使用的始终是一个该类的实例。

2、单例模式分为恶汉式和懒汉式。

3、恶汉式单例通用代码如下:

package com.wang.singletonPattern;

/**
 * 恶汉式单例
 * @author HeJW
 *
 */
public class Singleton1 {
	
	private static final Singleton1 singleton1 = new Singleton1();
	
	private Singleton1(){
		System.out.println("创建Singleton1实例");
	}
	
	/*
	 * 当其他类要使用该类是,通过调用该方法,得到该类的实例,并且得到的永远都是这一个
	 */
	public static Singleton1 getSingleton1(){
		return singleton1;
	}
	
}

 4、懒汉式单例代码如下:

package com.wang.singletonPattern;

/**
 * 懒汉式单例
 * @author HeJW
 *
 */
public class Singleton2 {

	private static Singleton2 singleton2 = null;
	
	private Singleton2(){
		System.out.println("创建Singleton2实例");
	}
	
	//如果不加synchronized关键字,线程不安全
	public static synchronized Singleton2 getSingleton2(){
		
		if( singleton2 == null ){
			singleton2 = new Singleton2();
		}
		
		return singleton2;
	}
	
}

 懒汉式单例记得要加synchronized关键字,如果不加synchronized关键字,线程不安全。如果一个A执行到

singleton2 = new Singleton2();

 ,但还没有获得对象(对象初始化是需要时间的),第二个线程B也在执行,执行到

singleton2 == null

 判断,那么线程B得到的判断也为真,于是线程B也创建了一个实例,这样就导致两个线程创建了两个对象,所以线程不安全,只能加上synchronized关键字。

5、单例模式扩展,生成指定数量的实例,代码如下:

package com.wang.singletonPattern;

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

/**
 * 单例模式扩展,生成指定数量的实例
 * @author HeJW
 *
 */
public class SingletonDevelop {

	//定义最多能生产两个实例
	private static int maxNum = 2;
	
	//定义一个列表,容纳多有的实例
	private static ArrayList<SingletonDevelop> singletonDeveloplist = new ArrayList<SingletonDevelop>();
	
	//产生指定数量的实例对象
	static{
		for( int i=0; i<maxNum; i++ ){
			singletonDeveloplist.add(new SingletonDevelop());
		}
	}
	
	private SingletonDevelop(){
		System.out.println("创建SingletonDevelop实例");
	}
	
	//得到随机的SingletonDevelop实例
	public static SingletonDevelop SingletonDevelop(){
		Random randrom = new Random();
		int singletonDevelopNum = randrom.nextInt(maxNum);
		return singletonDeveloplist.get(singletonDevelopNum);
	}
	
}

 

 

1
2
分享到:
评论

相关推荐

    单例模式的扩展及其应用

    编写一个类LimitInstanceClass,该类最多可以实例化指定个数实例。实例的个数用配置文件InstanceLimit.cfg指定。例如,如果InstanceLimit.cfg的内容为2,则LimitInstanceClass最多可以同时存在2个对象。...

    Java设计模式 版本2

    前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一性——单例模式,...

    design-pattern-java.pdf

    工厂三兄弟之抽象工厂模式(二) 工厂三兄弟之抽象工厂模式(三) 工厂三兄弟之抽象工厂模式(四) 工厂三兄弟之抽象工厂模式(五) 单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (一) 确保对象的...

    Delphi 深度探索(第二版)〖含随书光盘源代码〗

    6.1.2 单例模式(singleton) 6.1.3 建造模式(builder) 6.1.4 原型模式(prototype) 6.2 结构模式 6.2.1 适配器模式(adapter) 6.2.2 合成模式(composite模式) 6.2.3 装饰模式(decorator模式) ...

    day020-继承加强和设计模式代码和笔记.rar

    通过单例模式获取到对象后。就是只有一个对象的类 方法全部都是非static修饰的,调用方式:对象名.方法名(...); 4. 工具类命名: XxxUtil、XxxUtils、XxxTool、XxxTools 3. jar 包 (掌握)...

    MorphologicalAdaptation:出于我的Msc论文文档的目的,存储有一个形态适应库的冻结克隆的存储库

    模拟经理每个场景中的一个单例,可以完全控制模拟及其参数。 最值得注意的功能是: 最大时标:允许模拟运行正常速度多少次的硬上限。 目标帧率:管理员将尝试将帧率保持在此数字附近。 历时长:在选择发生之前,每个...

    精通QTP——自动化测试技术领航

    5.1.2 单例设计模式(Singleton) 346 5.2 GUI层面向对象的扩展设计 351 5.2.1 层的概念 351 5.2.2 封装测试对象类 352 5.2.3 调用业务行为 355 5.2.4 对象识别结果分析 355 5.2.5 总结 356 6.1 框架设计理念 356 ...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    XSS过滤以及单例模式 博客系统表结构讲解 博客系统功能讲解 CMDB介绍 CMDB实现的三种方式 CMDB Agent客户端示例 第26周 今日内容概要以及CMDB介绍 前端插件定制之表头 前端插件定制之表内容 第27周 前端插件定制...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics