单例变形--缓存在单例的使用和多例(单例+缓存+控制实例个数)
“单例+缓存“技术 与 “单例+缓存+控制实例个数”
缓存在编程中使用很频繁,有着非常重要的作用,它能够帮助程序实现以空间换取时间,通常被设计成整个应用程序所共享的一个空间,现要求实现一个用缓存存放单例对象的类。
说明:该缓存中可以存放多个该类对象,每个对象以一个key值标识,key值相同时所访问的是同一个单例对象。
实现代码中t1()函数表示简单的单例+缓存,t2()函数表示带对象的单例+缓存 ,t3()函数表示单例+缓存+控制实例个数:
Buffer类:
package cn.hncu.pattern.mulitition.one;
import java.util.HashMap;
import java.util.Map;
public class Buffer {
private static final Map<String, Book> map=new HashMap<String, Book>();
public static Book getInstance(String key){
Book book=map.get(key);
if(book==null){
book=new Book();
map.put(key, book);
}
return book;
}
}
Book类:
package cn.hncu.pattern.mulitition.one;
public class Book {
private String name;
private int no;
private double price;
private String details;
private static int count=1;
public Book(){
no=count++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
@Override
public String toString() {
return "Book [no=" + no + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + no;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
if (no != other.no)
return false;
return true;
}
}
简单的A类:
package cn.hncu.pattern.mulitition.one;
import java.util.HashMap;
import java.util.Map;
public class A {
private static final Map<String, A> map=new HashMap<String, A>();
public static A getInstance(String key){
A a=map.get(key);
if(a==null){
a=new A();
map.put(key, a);
}
return a;
}
}
Test类(main):
package cn.hncu.pattern.mulitition.one;
/**
* @author 军街
*
*/
public class Test {
public static void main(String[] args) {
// t1();
// t2();
t3();
}
private static void t3() {
System.out.println(cn.hncu.pattern.mulitition.two.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.two.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.two.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.two.A.getInstance());
System.out.println(cn.hncu.pattern.mulitition.two.A.getInstance());
}
private static void t2() {
Buffer buf=new Buffer();
System.out.println(buf.getInstance("111"));
System.out.println(buf.getInstance("222"));
System.out.println(buf.getInstance("111"));
System.out.println(buf.getInstance("222"));
}
private static void t1() {
A a1=A.getInstance("cn1");
System.out.println(a1);
A a2=A.getInstance("cn2");
System.out.println(a2);
A a3=A.getInstance("cn1");
System.out.println(a3);
A a4=A.getInstance("cn2");
System.out.println(a4);
}
}