享元模式(FlyWeight)个人认为是局部单例模式的意思

核心思想:如果在一个系统中存在多个相同的对象,那么只需共享一份对象的拷贝即可,不必每次都新建一个对象。


比如说图书馆,学生可以自行查询图书馆的图书信息,假设现在是分院系使用,每个院系可以自行查询本院系的一些图书

比如有计算机学院,信息学院,两个学院,每个学院都有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已经存在了,来驱除同样的对象,只保留相同的对象一份即可。


















你可能感兴趣的:(享元模式(FlyWeight)个人认为是局部单例模式的意思)