`
kinkding
  • 浏览: 150171 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

KEY生成类的两种写法(单多例)

    博客分类:
  • JAVA
阅读更多

单例模式写法:

package kg;

import java.util.HashMap;
import java.util.Map;

public class KeyGene {
	private static KeyGene instance;
	private Map<String, Key> cache;
	/** 缓存大小 */
	public static int SIZE = 10;

	private KeyGene() {
		cache = new HashMap<String, Key>();
	}

	public static KeyGene getInstance() {
		if (instance == null) {
			instance = new KeyGene();
		}
		return instance;
	}

	public int getNextKey(String keyName) {
		Key key = cache.get(keyName);
		if (key == null) {
			key = new Key(SIZE, keyName);
			cache.put(keyName, key);
		}
		return key.getNext();
	}

	public static void main(String[] args) {
		KeyGene kg = KeyGene.getInstance();
		int key = kg.getNextKey("goodjob");
	}
}

class Key {
	private int max;
	private int size;
	private int next;
	private String name;

	public Key(int size, String name) {
		this.size = size;
		this.name = name;
		dbOperate();
	}

	public synchronized int getNext() {
		if (next > max) {
			dbOperate();
		}
		return next++;
	}

	private void dbOperate() {
		// 执行数据库操作
		// if next >1 then
		// max = next+size;
		// update key_store set value=max where code = this.name
		// else
		// next = 1;
		// max = next+size;
		// insert into key_store(code,value)values(this.name,this.max);
	}
}

 

 

多例模式写法:

package kg;

import java.util.Map;

public class KeyGene2 {
	private static Map<String, KeyGene2> cache;
	public static int SIZE = 10;
	private Key key;

	private KeyGene2(String keyName) {
		key = new Key(SIZE, keyName);
	}

	public static KeyGene2 getInstance(String keyName) {
		KeyGene2 kg = cache.get(keyName);
		if (kg == null) {
			kg = new KeyGene2(keyName);
			cache.put(keyName, kg);
		}
		return kg;
	}

	public int getNextKey() {
		return key.getNext();
	}

	public static void main(String[] args) {
		KeyGene2 kg = KeyGene2.getInstance("goodjob");
		int key = kg.getNextKey();
	}
}

 

 

就我个人来看,多例模式写法更常用些。

分享到:
评论

相关推荐

    hibernate配置文件以及类映射文件常用写法1

    4. **一对一关系**:例如,用户与身份证一对一关系,可以使用`one-to-one`标签,有两种实现方式:主键共享和外键引用。 5. **继承映射**:分为简单继承和复杂继承。简单继承中,父类不映射,只映射子类。复杂继承则...

    python生成随机红包的实例写法

    在Python编程中,生成随机红包是一项常见的需求,特别是在开发红包类的应用或游戏中。...上述两种方法都可以实现这一功能,但实际应用中,通常会优先选择非递归的解决方案,因为它在处理大量红包时更高效。

    底层读键的两种简单思路的空间时间开销简单测试

    底层读键的两种简单思路的空间时间开销测试涉及到了嵌入式系统或单片机编程中,对按键状态的高效存储与读取方法。本文将围绕该主题展开,详细阐述两种不同的按键读取方法,即使用位存储和数组存储的思路,并对它们的...

    PV、UV的几种写法

    在数据分析和网站流量统计中,PV(Page View)和UV(Unique Visitor)是两个非常重要的概念。PV代表页面浏览量,即用户每打开一个页面就被计数一次;而UV则表示独立访客数,指的是不重复的访问者数量。本文将讨论...

    struts标签的写法

    这里使用了`&lt;%@ taglib %&gt;`指令来导入Struts提供的三种标签库: 1. **struts-html.tld**:提供了一系列用于生成HTML表单元素的标签。 2. **struts-bean.tld**:包含用于操作JavaBean对象的标签。 3. **struts-logic....

    易语言与PHP的RC4互相加密解密源码

    在这个上下文中,"易语言"和"PHP"是两种不同的编程语言,它们通过RC4算法实现了数据的加密和解密。 易语言是中国本土开发的一种简洁易学的编程语言,其目标是让普通用户也能进行编程。它提供了丰富的内置函数和模块...

    jsmap数据结构.pdf

    2. 使用链式写法,通过`set`方法一次性设置多个键值对: ```javascript const map2 = new Map() .set(60, '及格') .set(80, '良') .set(90, '优秀'); ``` 3. 传入二维数组作为构造函数的参数: ```javascript ...

    SpringBoot项目启动时如何读取配置以及初始化资源

    以下是对这两种技术的详细说明。 首先,SpringBoot项目通常使用YAML或properties格式的配置文件,这些文件通常位于`src/main/resources/config`目录下,文件名通常是`application.yml`或`application.properties`。...

    OLE & DOI.doc

    这两种技术主要用于实现Excel表格的自动化处理,包括数据填充和模板生成等功能。 #### 二、OLE技术简介 OLE是一种早期的技术,由SAP与Microsoft合作开发,用于实现SAP应用程序与Microsoft Office产品的无缝集成。...

    Javascript中的对象.pdf

    JavaScript对象的属性分为数据属性和访问器属性两种: 1. 数据属性由以下特性组成:[[Writable]](可写)、[[Value]](值)、[[Enumerable]](可枚举)、[[Configurable]](可配置)。 2. 访问器属性由以下特性组成...

    Oracle_start_with_connect_by_prior_用法[文].pdf

    要的时候有两种写法:CONNECT BY PRIOR EMPNO=MGR 或 CONNECT BY EMPNO=PRIOR MGR,前一种写法表示采用自上而下的搜索方式(先找父节点然后找子节点),后一种写法表示采用自下而上的搜索方式(先找叶子节点然后找父...

    Laravel中encrypt和decrypt的实现方法

    `Encrypter`类的实现位于`vendor/illuminate/encryption`目录下,包括`EncryptionServiceProvider`和`Encrypter`两个文件。 5. **分析`EncryptionServiceProvider`** 在这个服务提供者中,`register`方法注册了一...

    数据库面试题目

    以上两种方法都是Oracle环境下查看和分析SQL执行计划的有效途径,能够帮助数据库管理员和开发者深入了解查询优化的细节,从而提高数据库应用的性能。掌握这些技术点,不仅有助于应对数据库相关的面试挑战,也是日常...

    Vue03.pdf

    - `v-for`:用于迭代数组或对象,有两种写法:`v-for="值 in 数组"`和`v-for="(值, 序号) in 数组"`。 - `v-on`:用于绑定事件监听器,实际使用时通常使用缩写`@`,如`@click`。 - `v-bind`:用于动态地绑定一个...

    2021-2022计算机二级等级考试试题及答案No.923.docx

    5. 关系模型的关键字:关系模型中的关键字(Key)是由一个或多个属性组成的,这些属性的值能唯一标识表中的每一行(元组)。 6. PowerPoint 段落格式:在 PowerPoint 中,不仅可以设置文本的段落格式,还可以将选定...

    vue2+vue3笔记

    十八、el 与 data 的两种写法 Vue 是什么特点:声明式Vue-&gt;resource-&gt; awesome vue 和 cookbook 重点关注下面代码,第一个正常输出尚硅谷,第二个原格式输出{{name}}。 十九、MVVM 模型 理解 MVVM原理:把数据丢到...

    本人的一个APP程序,实现页面跳转

    Android应用通常使用Java或Kotlin编写,我们将基于这两种语言来讲解页面跳转的实现方法。 1. **Intent**: 在Android中,Intent是用来启动Activity或Service的桥梁。在页面跳转中,我们主要用它来启动新的Activity。...

    Objective-C笔试及答案

    继承是指类之间的一种关系,一个类可以从另一个类那里继承属性和方法;多态是指同一个操作作用于不同的对象,可以有不同的解释,并产生不同的执行结果。 - **对比分析:** 构造不是面向对象编程的基本特性,构造主要...

    js代码-对象最简便的json写法

    首先,JSON格式主要由两种基本类型组成:对象和数组。对象以大括号{}包围,键值对之间用逗号分隔,键用双引号包围,如`{"key": "value"}`;数组则以方括号[]包围,元素之间用逗号分隔,如`["element1", "element2"]`...

Global site tag (gtag.js) - Google Analytics