Flyweight
主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。
如本例中:用户通过不同品牌的手机发送短信,要求每个品牌只创建一次,当下次有人还要用创建过的对象发信息时,从对象池中拿。
① 创建一个发信息的接口(可供手机实现)
/**
* 发送消息的接口
*/
public interface Message {
void sendMessage();
}
② 创建手机对象,实现发短信的接口
/**
* 手机实现发送消息的接口
*/
public class Phone implements Message {
// 手机牌子
private String brand;
// 传入品牌获取手机
public Phone(String brand) {
this.brand = brand;
}
@Override
public void sendMessage() {
System.out.println("使用"+brand+"手机发送了一条信息");
}
}
③ 创建对象池(通过手机的品牌来确认对象池中是否有对象)
/**
* 对象池,手机工厂
* 如果手机牌子已经存在,返回存在池中的手机
* 如果手机牌子不存在,创建新的手机放入池中
*/
public class PhoneFactory {
// 对象池应该是只读的
private final static Map<String,Phone> phoneMap = new HashMap();
public Phone getPhone(String brand){
// 存在,直接返回
if(phoneMap.containsKey(brand)){
return phoneMap.get(brand);
}else {
// 不存在,创建并放入池中
Phone newPhone = new Phone(brand);
phoneMap.put(brand,newPhone);
return newPhone;
}
}
// 测试时查询对象池有几种品牌的手机
public int getSize(){
return phoneMap.size();
}
}
场景:对象的数量太大从而导致对象内存开销过大的情况(什么样数量才算大,需要具体评估)