享元模式
即共享元素,主要用于减少创建对象的数量以减少系统的复杂度.
应用实例有池技术如数据库连接池,线程池等
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
比如说你有通过单车出行的需求,正好有共享单车来满足你的需求,这样你就不用买单车车,减小了开销
实现
用 HashMap 存储这些对象。
//共享单车
abstract class BikeFlyWeight{
//内部状态
protected Integer state = 0;
//UserName外部状态,谁使用了单车
abstract void ride(String userName);
abstract void back();
public Integer getState(){
return state;
}
}
//扩展单车,每辆单车信息
class MoBikeFlyWeight extends BikeFlyWeight{
//定义新的内部状态,车牌号
private String BikeID;
public MoBikeFlyWeight(String BikeID){
this.BikeID = BikeID;
}
@Override
void ride(String username){
state = 1;
System.out.println(username+"骑"+BikeID+" 自行车出门");
}
@Override
void back(){
state = 0;
}
}
//共享单车商家的工厂(单例工厂)
class BikeFlyWeightFactory{
private static BikeFlyWeightFactory instance = new BikeFlyWeightFactory();
private Set<BikeFlyWeight> pool = new HashSet<>();
public static BikeFlyWeightFactory getInstance(){
return instance;
}
private BikeFlyWeightFactory(int maxObject){
for(int i = 0;i<maxObject;i++){
pool.add(new MoBikeFlyWeight(i+"号"));
}
}
public BikeFlyWeight getBike(){
for(BikeFlyWeight bike:pool){
if(bike.getState() == 0)
return bike;
}
return null;
}
}
**优点:**大大减少对象的创建,降低系统的内存,使效率提高。
**缺点:**提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。