享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
享元模式的实现:
1. 创建手机类
//手机类
public class Phone {
private String brand; //品牌
private int cost; //价格
public Phone(String brand){
this.brand = brand;
}
public void setCost(int cost) {
this.cost = cost;
}
@Override
public String toString() {
return "Phone{" +
"brand='" + brand + '\'' +
", cost=" + cost +
'}';
}
}
2. 创建手机工厂类
public class PhoneFactory {
private static final HashMap<String,Phone> pool = new HashMap<>();
public static Phone getPhone(String brand){
Phone phone = pool.get(brand);
if(phone == null){
phone = new Phone(brand);
pool.put(brand,phone);
System.out.println("创建了一个" + brand + "手机");
}
return phone;
}
}
3. 使用享元模式
public class FlyWeightMain {
public static void main(String[] args) {
String[] brands = {"华为","vivo","oppo","小米","华为","vivo","oppo","小米","华为"};
for(int i=0;i<brands.length;i++){
Phone phone = PhoneFactory.getPhone(brands[i]);
phone.setCost((int) (Math.random() * 5000));
System.out.println(phone.toString());
}
}
}
可以看到我们好像创建和很多手机实例,但是只真正创建了4个对象,其他的都是对对象的重复使用。