定义
运用共享技术有效地支持大量细粒度对象。
相关的名称定义
- 内部状态:可以共享的状态,不会随着环境的变化而变化。
- 外包状态:不可以共享的状态,会随着环境的变化而变化
- 享元工厂:创建享元对象的工厂。判断对象是否存在,若存在直接返回,不存在则创建新的对象并返回。通常是一个Map来保存,键为内部状态。
享元模式的使用场景
- 系统中存在大量的相似对象
- 细粒度对象具备较相近的外部状态,也就是说对象没有特定身份。
- 需要缓冲池的场景
享元模式的优缺点
优点:
- 尽可能减少内存的使用
- 提高性能、避免内存移除
缺点:
- 使得系统更加复杂
- 读取外部状态时间加长
享元模式实例
- Ticket
public interface Ticket {
void showTicketInfo();
}
- TrainTicket
public class TrainTicket implements Ticket {
private String from;
private String to;
private int price;
public TrainTicket(String from, String to) {
this.from = from;
this.to = to;
}
@Override
public void showTicketInfo() {
this.price = new Random().nextInt(100);
System.out.println("从 " + from + " 开往 " + to + " 的列车,票价为:" + price);
}
}
- TicketFactory
public class TicketFactory {
private Map<String, Ticket> mTickets = new HashMap<String, Ticket>();
public Ticket getTicket(String from, String to) {
String key = from + "-" + to;
if (mTickets.containsKey(key)) {
Ticket ticket = mTickets.get(key);
return ticket;
}
TrainTicket ticket = new TrainTicket(from, to);
mTickets.put(key, ticket);
return ticket;
}
public int getHoldTicketCount(){
return mTickets.size();
}
}
- Client
public class Client {
public static void main(String[] args) {
TicketFactory ticketFactory = new TicketFactory();
Ticket ticket1 = ticketFactory.getTicket("深圳", "北京");
ticket1.showTicketInfo();
Ticket ticket2 = ticketFactory.getTicket("海口", "广州");
ticket2.showTicketInfo();
Ticket ticket3 = ticketFactory.getTicket("海口", "广州");
ticket3.showTicketInfo();
System.out.println("持有ticket实例数:"+ticketFactory.getHoldTicketCount());
}
}
参考:
- 《大话设计模式》
- 《android源码设计模式》