核心思想:如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝即可,不必每次都新建一个对象。
比如说图书馆,学生可以自行查询图书馆的图书信息,假设现在是分院系使用,每个院系可以自行查询本院系的一些图书
比如有计算机学院,信息学院,两个学院,每个学院都有1000人,那么共2000人,每个院系的1000人去查询本院系的图书时,我们是否需要给1000个人每个人都去创建一个数据库的查询对象呢?显然,不需要,否则,系统性能太低了,我们应该让这1000人都拥有同样的数据库查询对象,因为执行的结果都一样嘛
public interface BookQuery {
public void queryBook();
}
public class CSBookQuery implements BookQuery {
protected String flag = null;
public CSBookQuery(String flag) {
this.flag = flag;
}
@Override
public void queryBook() {
// TODO Auto-generated method stub
System.out.println("计算机学院查询图书!");
}
}
public class InfoBookQuery implements BookQuery {
protected String flag = null;
public InfoBookQuery(String flag) {
this.flag = flag;
}
@Override
public void queryBook() {
// TODO Auto-generated method stub
System.out.println("信息学院查询图书!");
}
}
public class BookQueryFactory {
Map<String,CSBookQuery> cs = new HashMap<String,CSBookQuery>();
Map<String,InfoBookQuery> in = new HashMap<String,InfoBookQuery>();
BookQuery getCs(String flag) {
BookQuery bq = cs.get(flag);
if(bq==null) {
bq = new CSBookQuery(flag);
cs.put(flag, (CSBookQuery) bq);
}
return bq;
}
BookQuery getIn(String flag) {
BookQuery bq = in.get(flag);
if(bq==null) {
bq = new InfoBookQuery(flag);
in.put(flag, (InfoBookQuery) bq);
}
return bq;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
BookQueryFactory bqf = new BookQueryFactory();
BookQuery bq1 = bqf.getIn("1");
BookQuery bq2 = bqf.getIn("1");
BookQuery bq3 = bqf.getCs("1");
BookQuery bq4 = bqf.getCs("1");
System.out.println(bq1==bq2);
System.out.println(bq1==bq3);
System.out.println(bq3==bq4);
}
结果
true
false
true
从结果中我们可以清楚的看到,信息学院用的是同一个对象,计算机学院用的是同一个对象,而计算机学院和信息学院就不是同一个对象了。
从享元工厂类中我们可以看出,区别是不是同一个学院的,用的方法就是通过一个flag字段,所有的对象都是通过Map来判断key是否有flag的key已经存在了,来驱除同样的对象,只保留相同的对象一份即可。