享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
情景
以吃东西为例,想吃饼干了,家里真好有,直接拿来吃吧,省的买的功夫,既没花钱又没跑路,哎,没有可乐了,还是去买一下吧,去超市太远了,网购又要痛苦的等待。。。。
享元模式
我们演示需要三个类,一个实体Food类,一个工厂类,一个模式实现类。
Food类
Food类是实体类,我们要求简单一点,就给一个属性name就好啦(如果愿意的话,里面什么都不写也是可以的)
public class Food {
@Override
public String toString() {
return "Food{" +
"name='" + name + '\'' +
'}';
}
private String name;
public Food(String name) {
this.name = name;
}
}
FoodFactory类
用工厂类来处理对象
import java.util.HashMap;
public class FoodFactory {
private static final HashMap<String,Food> foods=new HashMap<>();
public static Food getFood(String name){
Food food=(Food)foods.get(name);
if(food==null){
food=new Food(name);
foods.put(name,food);
System.err.println("Create a new food "+name);
}
System.err.println("get food");
return food;
}
}
模式实现类FlyweightPattern
这个类也比较简单,通过输入名字取工厂中查询
import java.util.Scanner;
public class FlyweightPattern {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
for(int i=0;i<5;i++){
System.out.println("Please input name of food:");
Food food=(Food)FoodFactory.getFood(scanner.next());
System.out.println(food);
System.out.println("..........................");
}
}
}
结果如下
Please input name of food:
rice
Create a new food rice
get food
Food{name='rice'}
..........................
Please input name of food:
cookie
Create a new food cookie
get foodFood{name='cookie'}
..........................
Please input name of food:
cookie
get food
Food{name='cookie'}
..........................
Please input name of food