定义:提供了减少对象数量从而改善应用所需的对象结构的方式
java String类就是使用了 享元设计模式 还有数据库连接池等
缺点
关注内部或者外部结构,关于线程安全的问题
使系统 逻辑结构复杂化
内部状态
不随外界变化而变化的
外部状态
会随外界变化而发生变化的
比如计算公司有几个部门 每个部门有多少人
public class Department {
private String name;
private int count;
public Department(String name, int count) {
this.name = name;
this.count = count;
System.out.println("create object");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
public class DepartmentFactory {
private static Map<String,Department> map = new Hashtable<>();
public static Department getDepartment(String str){
if(map.get(str)==null){
Department department = new Department(str, (int) (Math.random()*100));
map.put(str,department);
}
return map.get(str);
}
}
测试类
public class Test {
public static void main(String[] args) {
Department department = DepartmentFactory.getDepartment("销售部门");
System.out.println(department.getCount());
Department department1 = DepartmentFactory.getDepartment("销售部门");
System.out.println(department1.getCount());
}
}
这个在Android图片加载库中的LRUCache中就用到了,就是利用了享元模式,再看下jdk系统源码中那用到了享元模式,看下Integer
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
意思是-128到127这个数据会缓存起来 超过这个就不缓存了,这里面就用到了享元模式,看下例子
Integer a = Integer.valueOf(127);
Integer b = 127;
System.out.println("a==b的结果为"+(a==b));
Integer c = Integer.valueOf(128);
Integer d = 128;
System.out.println("c==d的结果为"+(c==d));
结果
a==b的结果为true
c==d的结果为false
这个是多年前笔试很容易考到的.