享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
享元模式的实现:
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个对象,其他的都是对对象的重复使用。
下一节:
组合模式:【每天一个java设计模式(十二)】 - 组合模式