介绍
亨元模式主要作用是减少创建对象的数量,增加内存和CPU的使用效率,从而达到提高性能的目的。
**优点:**大大减少对象的创建,降低系统的内存。
**缺点:**增加了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固话的性质,不应随内部变化而变化,否则容易造成系统混乱。
代码示例
我们写一个简单的亨元模式,实现共享用户数据,通过用户名称,直接读取到共享的用户数据,而不是每次都去创建一个新的对象。
- 我们顶一个抽象接口和一个简单的use实体
/**
* 定义一个亨元抽象方法
*/
public abstract class FlyweightAbs {
abstract void print();
}
@Data
public class User implements Serializable {
private String name;
private String email;
}
- 亨元对象我们指定为user类型。
/**
* 亨元对象
*/
public class Flyweight extends FlyweightAbs {
private User user;
public Flyweight(User user){
this.user=user;
}
//我们输出用户名字和hashCode ,验证我们的模式是否成功。
void print() {
System.out.println("hello > "+user.getName()+"<>"+user.hashCode());
}
}
- 我们需要一个工厂类来辅助,通过name 获取user对象。
public class FlyweightFactory {
private static Map<String, Flyweight> dataMap;
//构造器
public FlyweightFactory(){
dataMap=new HashMap<>();
}
public Flyweight getFlyweight(String name){
if(dataMap.containsKey(name)){
return dataMap.get(name);
}else{
//如果对象不存在,那么我们就创建一个对象,并封装到map中,以实现共享
User user=new User();
user.setName(name);
Flyweight flyweight=new Flyweight(user);
dataMap.put(name,flyweight);
return flyweight;
}
}
}
- 接下我们通过实验验证是否已经实现数据共享,
public static void main(String[] args){
FlyweightFactory factory=new FlyweightFactory();
String[] names=new String[]{"doc","Tom","Div"};
for(int i=0;i<10;i++){
Flyweight flyweight=factory.getFlyweight(names[i%3]);
flyweight.print();
}
}
运行main方法,输出结果如下图所示,我们发现同名字的user对象的hashcode值是一样的,可见通过亨元模式我们实现了user对象的共享。