享元模式 是对对象池的一种实现。使用共享对象可以有效地支持大量的细粒度的对象。当系统中存在大量的相似对象,可以使用享元模式;细粒度对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份;需要缓冲池的场景,也适合使用享元模式。
1 创建一个接口:
package flyweightpattern2;
public interface Ticket {
public void showTicketInfo(String bunk);
}
2 创建接口的实现类:
package flyweightpattern2;
import java.util.Random;
public class TrainTicket implements Ticket{
public String from;
public String to;
public String bunk;
public int price;
public TrainTicket(String from, String to) {
super();
this.from = from;
this.to = to;
}
@Override
public void showTicketInfo(String bunk) {
price = new Random().nextInt(300);
System.out.println("车票:"+from +"到"+to +"的"+bunk+"---价格:"+price);
}
}
3 创建管理对象的对象池
package flyweightpattern2;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class TicketFactory {
static Map<String , Ticket> sTicketMap = new ConcurrentHashMap<>();
public static Ticket getTcket(String from, String to){
String key = from +"-"+to;
if (sTicketMap.containsKey(key)) {
System.out.println("使用缓存="+key);
return sTicketMap.get(key);
}else {
System.out.println("创建对象="+key);
Ticket ticket = new TrainTicket(from, to);
sTicketMap.put(key, ticket);
return new TrainTicket(from, to);
}
}
}
4 测试对象的调用情况:
package flyweightpattern2;
public class Test {
public static void main(String[] args) {
Ticket ticket = TicketFactory.getTcket("A", "B");
ticket.showTicketInfo("上铺");
Ticket ticket1 = TicketFactory.getTcket("A", "B");
ticket.showTicketInfo("上铺");
}
}
输出结果,显示使用了缓存的对象:
创建对象=A-B
车票:A到B的上铺---价格:246
使用缓存=A-B
车票:A到B的上铺---价格:152