`
pjwqq
  • 浏览: 81320 次
社区版块
存档分类
最新评论

单例模式-键值生成器

阅读更多

    最近看<JAVA与模式>,单例章节的例子,我作了修改之后的练习,用properties文件代替数据库,略有不同。

    需求:某个系统需要的多键值生成器,键值唯一,键值缓存(避免多次访问,节约资源)

    实现:

 

    一个标准单例:

package singleton.keyGenerator;

import java.util.HashMap;

public class KeyGenerator {

	private static KeyGenerator keyGenerator = new KeyGenerator();
	private HashMap<String, KeyBuffer> KeyPool = new HashMap<String, KeyBuffer>();//缓存

	private KeyGenerator() {

	}

	public static KeyGenerator getInstance() {
		return keyGenerator;
	}

        //第一次使用,放入缓存,否则直接使用
	public int getNextKey(String key) {
		if (!KeyPool.containsKey(key)) {
			KeyPool.put(key, new KeyBuffer(key));
		}
		return KeyPool.get(key).getNextVal(key);
	}

}

 

    单键的缓存:

package singleton.keyGenerator;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

//单键值的缓存类
public class KeyBuffer {
	private int nextKey;
	private int maxKey;
	// 键缓存大小
	private int PoolSize = 3;
	
	public KeyBuffer(String key) {
		getFromFile(key);
	}

	public synchronized int getNextVal(String key) {
		if (nextKey > maxKey) {
			getFromFile(key);
		}
		return nextKey++;
	}

	private synchronized void getFromFile(String key) {
		Properties prop = new Properties();
		System.out.println("ReadFromFile:"+key);
		try {
			InputStream in = new FileInputStream("c:\\key.properties");
			prop.load(in);
			if (!prop.containsKey(key)) {
                                //文件中没有此键,异常
				throw new RuntimeException("key not defined");
			}
			nextKey = Integer.valueOf((String) prop.get(key)) + 1;
			maxKey = nextKey + PoolSize - 1;
			in.close();
			//
			OutputStream out = new FileOutputStream("c:\\key.properties");
			prop.setProperty(key, Integer.toString(maxKey));
			prop.store(out, "From KeyGenerator");
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

     测试:

package singleton.keyGenerator;

public class Client {

	public static void main(String[] args) {
		KeyGenerator keyGenerator = KeyGenerator.getInstance();
		System.out.println(keyGenerator.getNextKey("KEY"));
		System.out.println(keyGenerator.getNextKey("NEWKEY"));
		System.out.println(keyGenerator.getNextKey("KEY"));
		System.out.println(keyGenerator.getNextKey("NEWKEY"));
		System.out.println(keyGenerator.getNextKey("KEY"));
		System.out.println(keyGenerator.getNextKey("NEWKEY"));
		System.out.println(keyGenerator.getNextKey("KEY"));
		System.out.println(keyGenerator.getNextKey("NEWKEY"));
		System.out.println(keyGenerator.getNextKey("KEY"));
		System.out.println(keyGenerator.getNextKey("NEWKEY"));
	}
}

 

测试结果:

ReadFromFile:KEY

71

ReadFromFile:NEWKEY

1016

72

1017

73

1018

ReadFromFile:KEY

74

ReadFromFile:NEWKEY

1019

75

1020

 

文件 key.properties

#From KeyGenerator

#Fri Jan 24 20:33:20 CST 2014

KEY=76

NEWKEY=1021

 

总结:单例是个很有意思的模式吐舌头

1
2
分享到:
评论

相关推荐

    java与模式chp18[归类].pdf

    《Java与模式》第18章探讨了在Java开发中如何处理序列键生成以及应用单例和多例模式。...单例模式用于确保序列键管理器的唯一性,而多例模式则适用于需要多个独立实例的情况,两者结合可以有效应对复杂系统的需求。

    qt日志模块 生成日志ini文件 单例 源码

    在日志模块中应用单例模式,可以确保在整个应用程序中,日志管理器只有一个实例,避免了多线程环境下可能存在的并发问题。通过单例,所有模块都可以共享同一份日志接口,保证日志的一致性和完整性。 在`...

    python面试宝典

    - 单例模式、工厂模式、装饰器模式、生成器模式等。 5. 面向对象编程 - 类与对象的创建和使用。 - 继承、多态、封装等面向对象的核心概念。 6. 正则表达式 - 字符串的模式匹配和文本处理。 【系统和网络编程...

    python语言学习笔记.pdf

    - 单例模式确保类只有一个实例,并提供全局访问点。 十六、异常、模块与包 异常处理、模块和包是Python中处理错误和组织代码的重要概念: - 基本语法,如编码声明; - 异常处理,使用try-except语句; - 模块和包,...

    C#开发炫舞游戏练习器源码(含有背景图片切换和获取键值)

    【标题解析】 ...8. 设计模式:如单例模式用于管理全局资源,工厂模式用于生成游戏对象等。 这些知识点将构成炫舞游戏练习器的核心部分,对于想要深入理解和开发类似项目的人来说,是很好的学习材料。

    第004章 基于python语言常见的问题.rarpython面试

    - generator:生成器函数,用于创建迭代器,节省内存。 - context manager:使用with语句管理资源,自动执行清理工作。 - decorator:装饰器,用于修改或增强函数、类的行为。 10. **Python面试常问问题** - ...

    24种设计模式介绍与6大设计原则

    类似于单例模式,但是允许多个实例存在,每个实例代表一个特定的状态或键值。多例模式可以在某些情况下替代单例模式,提供更灵活的实例化机制。 #### 5. 工厂方法模式(Factory Method Pattern) 定义一个用于创建...

    互联网大厂Java面试题合集

    - **自制小工具**:开发人员可能会创建各种辅助工具,如代码生成器、性能监控脚本等。 - **改进案例**:例如对某个工具的性能瓶颈进行分析,通过重构或引入更高效的技术来提升其运行效率。 ##### 8.1.3 提升Python...

    海辉面试题

    - **Struts2**:默认情况下,Action也是单例模式,但可以通过配置实现每次请求一个新的实例。 #### 10. Struts1.X与Struts2.X有哪些区别 - **架构差异**:Struts1使用命令模式,而Struts2采用拦截器模式。 - **MVC...

    Hibernate面试题-详尽解析

    - **定义**: `native`是一种动态选择标识符生成策略的方式,它根据所使用的底层数据库系统自动选择最适合的生成器(如`identity`、`sequence`或`hilo`)。这种方式非常适合需要跨数据库平台的应用开发。 - **适用...

    python最新面试宝典

    - 设计模式:单例、工厂、装饰器、生成器等设计模式在Python中的应用。 - 面向对象:理解类和对象的概念,以及继承、多态等OOP特性。 - 正则表达式:用于文本处理和模式匹配的方法。 - 系统编程:Python在系统级...

    Python面试大全.pdf

    1. 单例模式:包括单例模式的概念、使用方法和优点。 2. 工厂模式:包括工厂模式的概念、使用方法和优点。 十、其他 1. 装饰器:包括装饰器的概念、使用方法和优点。 2. 生成器:包括生成器的概念、使用方法和优点...

    超星、道有道等面试问题总结.pdf

    单例模式在实际项目中有很多应用场景,比如日志记录器、数据库连接池管理、配置管理等。 ##### 3.1 用枚举实现单例模式 枚举是另一种实现单例的有效方式,不仅简洁而且保证了线程安全。示例如下: ```java public...

    大厂python面试常见的25个问题

    - **生成器**:使用生成器节约内存,处理大量数据。 12. **设计模式** - **工厂模式**、**单例模式**、**装饰器模式**等,理解其概念并在Python中应用。 这些问题涵盖了Python程序员应具备的基础知识和技能,...

    java知识点回顾

    - 创建型模式:如工厂模式、抽象工厂模式、单例模式等。 - 结构型模式:如适配器模式、装饰者模式、代理模式等。 - 行为型模式:如策略模式、命令模式、观察者模式等。 ### 11. 图形用户界面 (GUI) Java 提供了 ...

    python面试题.rar

    19. **设计模式**:虽然Python不是面向对象的强制语言,但理解设计模式如工厂模式、单例模式、装饰器模式等可以提升代码的可读性和可维护性。 20. **Python3新特性**:了解Python3相较于Python2的新特性,如print...

Global site tag (gtag.js) - Google Analytics