设计模式之享元模式

享元模式(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值