享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
享元模式的实现:
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设计模式(零)】 - 设计模式基本概念及七大设计原则
- 工厂模式:【每天一个java设计模式(一)】 - 工厂模式
- 抽象工厂模式: 【每天一个java设计模式(二)】 - 抽象工厂模式
- 单例模式:【每天一个java设计模式(三)】 - 单例模式
- 原型模式:【每天一个java设计模式(四)】 - 原型模式
- 建造者模式: 【每天一个java设计模式(五)】 - 建造者模式
- 适配器模式 : 【每天一个java设计模式(六)】 - 适配器模式
- 代理模式: 【每天一个java设计模式(七)】 - 代理模式模式
- 桥接模式:【每天一个java设计模式(八)】 - 桥接模式
- 装饰器模式:【每天一个java设计模式(九)】 - 装饰器模式
- 外观模式:【每天一个java设计模式(十)】 - 外观模式
下一节:
组合模式:【每天一个java设计模式(十二)】 - 组合模式