享元模式是为了解决创建大量重复对象问题,注意此处一定是重复对象,重复对象:即除了堆栈的地址不一样外其他的数据和结构完全一样的对象
类图:
享元类:
public interface FlyWeight {
public void print();
}
//对于这个具体享元对象而言只要id一样则它对外展现就是一样的,因为name是通过id生成了,而整个对象只有一个print方法
public class ConcreteFlyWeight implements FlyWeight {
private static int createCount = 0;// 记录创建次数
private int id;
private String name;
public ConcreteFlyWeight(int id) {
super();
this.id = id;
this.name = "name" + id;
createCount++;// 记录创建次数
}
@Override
public void print() {
System.out.println("ConcreteFlyWeight [id=" + id + ", name=" + name + "]");
}
public static int getCreateCount() {
return createCount;
}
}
享元工厂:
public class ConcreteFlyWeight implements FlyWeight {
private static int createCount = 0;// 记录创建次数
private int id;
private String name;
public ConcreteFlyWeight(int id) {
super();
this.id = id;
this.name = "name" + id;
createCount++;// 记录创建次数
}
@Override
public void print() {
System.out.println("ConcreteFlyWeight [id=" + id + ", name=" + name + "]");
}
public static int getCreateCount() {
return createCount;
}
}
客户端类:
public class Client {
public static void main(String[] args) {
FlyWeight flyWeight1 = FlyWeightFactory.getFlyWeight(1);
flyWeight1.print();
System.out.println(flyWeight1);
FlyWeight flyWeight2 = FlyWeightFactory.getFlyWeight(1);
flyWeight2.print();
System.out.println(flyWeight2);
System.out.println("创建次数" + ConcreteFlyWeight.getCreateCount());
}
}
结果:
ConcreteFlyWeight [id=1, name=name1]
ConcreteFlyWeight@41975e01
ConcreteFlyWeight [id=1, name=name1]
ConcreteFlyWeight@41975e01
创建次数1
使用享元模式的时候一定要主要对于客户端而言是不是真的重复对象,重点在重复对象这四个字上,如果对客户端而言这不是重复对象,则一定不能使用享元模式,个人觉得,重复对象是针对使用者,也就是客户端而言,只要客户端使用两个对象没有什么不一样就可以认定是重复对象,就可以使用享元模式(使用享元模式切忌臆断,自己看起来不重复的对象其实对于客户端而言就是重复的,或者自己看起来重复的对于客户端而言就不是重复的)