最近看<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
总结:单例是个很有意思的模式
相关推荐
《Java与模式》第18章探讨了在Java开发中如何处理序列键生成以及应用单例和多例模式。...单例模式用于确保序列键管理器的唯一性,而多例模式则适用于需要多个独立实例的情况,两者结合可以有效应对复杂系统的需求。
在日志模块中应用单例模式,可以确保在整个应用程序中,日志管理器只有一个实例,避免了多线程环境下可能存在的并发问题。通过单例,所有模块都可以共享同一份日志接口,保证日志的一致性和完整性。 在`...
- 单例模式、工厂模式、装饰器模式、生成器模式等。 5. 面向对象编程 - 类与对象的创建和使用。 - 继承、多态、封装等面向对象的核心概念。 6. 正则表达式 - 字符串的模式匹配和文本处理。 【系统和网络编程...
- 单例模式确保类只有一个实例,并提供全局访问点。 十六、异常、模块与包 异常处理、模块和包是Python中处理错误和组织代码的重要概念: - 基本语法,如编码声明; - 异常处理,使用try-except语句; - 模块和包,...
【标题解析】 ...8. 设计模式:如单例模式用于管理全局资源,工厂模式用于生成游戏对象等。 这些知识点将构成炫舞游戏练习器的核心部分,对于想要深入理解和开发类似项目的人来说,是很好的学习材料。
- generator:生成器函数,用于创建迭代器,节省内存。 - context manager:使用with语句管理资源,自动执行清理工作。 - decorator:装饰器,用于修改或增强函数、类的行为。 10. **Python面试常问问题** - ...
类似于单例模式,但是允许多个实例存在,每个实例代表一个特定的状态或键值。多例模式可以在某些情况下替代单例模式,提供更灵活的实例化机制。 #### 5. 工厂方法模式(Factory Method Pattern) 定义一个用于创建...
- **自制小工具**:开发人员可能会创建各种辅助工具,如代码生成器、性能监控脚本等。 - **改进案例**:例如对某个工具的性能瓶颈进行分析,通过重构或引入更高效的技术来提升其运行效率。 ##### 8.1.3 提升Python...
- **Struts2**:默认情况下,Action也是单例模式,但可以通过配置实现每次请求一个新的实例。 #### 10. Struts1.X与Struts2.X有哪些区别 - **架构差异**:Struts1使用命令模式,而Struts2采用拦截器模式。 - **MVC...
- **定义**: `native`是一种动态选择标识符生成策略的方式,它根据所使用的底层数据库系统自动选择最适合的生成器(如`identity`、`sequence`或`hilo`)。这种方式非常适合需要跨数据库平台的应用开发。 - **适用...
- 设计模式:单例、工厂、装饰器、生成器等设计模式在Python中的应用。 - 面向对象:理解类和对象的概念,以及继承、多态等OOP特性。 - 正则表达式:用于文本处理和模式匹配的方法。 - 系统编程:Python在系统级...
1. 单例模式:包括单例模式的概念、使用方法和优点。 2. 工厂模式:包括工厂模式的概念、使用方法和优点。 十、其他 1. 装饰器:包括装饰器的概念、使用方法和优点。 2. 生成器:包括生成器的概念、使用方法和优点...
单例模式在实际项目中有很多应用场景,比如日志记录器、数据库连接池管理、配置管理等。 ##### 3.1 用枚举实现单例模式 枚举是另一种实现单例的有效方式,不仅简洁而且保证了线程安全。示例如下: ```java public...
- **生成器**:使用生成器节约内存,处理大量数据。 12. **设计模式** - **工厂模式**、**单例模式**、**装饰器模式**等,理解其概念并在Python中应用。 这些问题涵盖了Python程序员应具备的基础知识和技能,...
- 创建型模式:如工厂模式、抽象工厂模式、单例模式等。 - 结构型模式:如适配器模式、装饰者模式、代理模式等。 - 行为型模式:如策略模式、命令模式、观察者模式等。 ### 11. 图形用户界面 (GUI) Java 提供了 ...
19. **设计模式**:虽然Python不是面向对象的强制语言,但理解设计模式如工厂模式、单例模式、装饰器模式等可以提升代码的可读性和可维护性。 20. **Python3新特性**:了解Python3相较于Python2的新特性,如print...