核心思想:如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝即可,不必每次都新建一个对象。
比如说图书馆,学生可以自行查询图书馆的图书信息,假设现在是分院系使用,每个院系可以自行查询本院系的一些图书
比如有计算机学院,信息学院,两个学院,每个学院都有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已经存在了,来驱除同样的对象,只保留相同的对象一份即可。