首页 > 其他分享 >12) Flyweight Pattern

12) Flyweight Pattern

时间:2023-06-09 13:44:23浏览次数:55  
标签:shop 12 name Pattern takeOrder Serving Flyweight table final

类别:

 Structural Pattern

问题/动机:

 

假若绿色是相同部分,占用1M内存 ,如果提取出来,众对象共享其内容,只占1M内存 ,否则占10M ,且随着对象增多,占用越来越多内存 ,无疑是浪费资源

A flyweight is an object that minimizes memory usage by sharing as much data as possible with other similar objects (通过共享来削减内存)

方案:

 

 

 

示例:

 

import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;

public class FlyweightPatternDemo {

    public static void main(final String[] args) {
        CoffeeShop shop = new CoffeeShop();

        shop.takeOrder("Cappuccino", 2);
        shop.takeOrder("Latte", 1);
        shop.takeOrder("Macchiato", 1);
        shop.takeOrder("Latte", 4);
        shop.takeOrder("Cappuccino", 5);
        shop.takeOrder("Latte", 3);
        shop.takeOrder("Macchiato", 3);
        shop.takeOrder("Cappuccino", 3);
        shop.takeOrder("Macchiato", 5);
        shop.takeOrder("Latte", 5);
        shop.takeOrder("Cappuccino", 3);
        shop.takeOrder("Macchiato", 5);

        shop.service();
        System.out.println(shop.report());
    }
}

// Instances of CoffeeFlavour will be the Flyweights
class Coffee {
    private final String name;

    Coffee(final String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}

// Menu acts as a factory and cache for CoffeeFlavour flyweight objects
class Menu {
    private Map<String, Coffee> coffeeMap = new ConcurrentHashMap<String, Coffee>();

    synchronized Coffee lookup(final String name) {
        if (!coffeeMap.containsKey(name))
            coffeeMap.put(name, new Coffee(name));
        return coffeeMap.get(name);
    }

    synchronized int totalCoffeeMade() {
        return coffeeMap.size();
    }
}

// Order is the context of the CoffeeFlavour flyweight.
class Order {
    private final int tableNumber;
    private final Coffee coffee;

    Order(final int tableNumber, final Coffee coffee) {
        this.tableNumber = tableNumber;
        this.coffee = coffee;
    }

    void serve() {
        System.out.println("Serving " + coffee + " to table " + tableNumber);
    }
}

class CoffeeShop {
    private final List<Order> orders = new Vector<Order>();
    private final Menu menu = new Menu();

    void takeOrder(final String name, final int table) {
        Coffee coffee = menu.lookup(name);
        Order order = new Order(table, coffee);
        orders.add(order);
    }

    void service() {
        for (Order order : orders)
            order.serve();
    }

    String report() {
        return "\ntotal coffee objects made: " + menu.totalCoffeeMade();
    }

}

 

Serving Cappuccino to table 2
Serving Latte to table 1
Serving Macchiato to table 1
Serving Latte to table 4
Serving Cappuccino to table 5
Serving Latte to table 3
Serving Macchiato to table 3
Serving Cappuccino to table 3
Serving Macchiato to table 5
Serving Latte to table 5
Serving Cappuccino to table 3
Serving Macchiato to table 5

total coffee objects made: 3

 

应用:

 

不足:(

 

优化:)

 

标签:shop,12,name,Pattern,takeOrder,Serving,Flyweight,table,final
From: https://www.cnblogs.com/zno2/p/6694840.html

相关文章

  • 11) Facade Pattern
    类别: StructuralPattern问题/动机:系统非常复杂隐藏复杂细节,提供简单界面方案:  示例: /*Complexparts*/publicclassFacadePatternDemo{publicstaticvoidmain(String[]args){CarFacadefacade=newCarFacade();facade.CreateC......
  • ADM1232ARNZ ADI 电子元器件
    ADM1232ARNZ是一款由ADI公司生产的电源管理芯片,主要用于电源监测和重启控制。以下是该芯片的详细参数:输入电压范围:4.5V至5.5V工作温度范围:-40°C至+85°C重启控制输出电压范围:0V至VCC重启控制输出电流:25mA(最大)监测输出电压范围:0V至VCC监测输出电流:5mA(最大)重启控......
  • 0012.有监督学习之随机森林(Random Forest)
    一、概述随机森林:最为新兴起的、高度灵活的一种机器学习算法,随机森林(RandomForset,简称RF)拥有广泛的应用前景,从市场销售到医疗保健保险,既可以用来做市场销售模拟的建模,统计客户来源,保留和流失,也可用预测疾病的风险和病患者的易感性。随机森林算法是一种重要的基于bagging的集成......
  • F12-Network面板介绍
    前言在测试人员测试过程中经常需要通过抓包来区分一些前后端的Bug,特别是Web端的测试,利用浏览器中的F12开发者选项,就能进行网站界面测试、调试,分析网页所出现的问题,查看html元素、查看响应事件等方面。F12开发者工具面板用Google打开一个页面,点击键盘右上方的F12按钮,弹出F12开发者......
  • 1254. 统计封闭岛屿的数目
    1254.统计封闭岛屿的数目二维矩阵grid 由0 (土地)和1 (水)组成。岛是由最大的4个方向连通的0 组成的群,封闭岛是一个 完全由1包围(左、上、右、下)的岛。请返回封闭岛屿的数目。示例1:输入:grid=[[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1......
  • P1121 环状最大两段子段和
    P1121环状最大两段子段和非环状最大两子段和\[fr[i]表示第1\toi个元素的最大子段和ba[i]表示第n\toi个元素的最大子段和所以最大两子段和就是max(fr[i]+ba[i+1]),i\in[1,n)\]intSolve(){ intans=-0x3f3f3f3f; for(inti=1;i<=n;i++)fr[i]=max(fr[i-1],0ll)+a[i]......
  • 5000字、12 连环炮、一张图快速搞定线程池
    写在前面前面文章中,我们总结了JVM18连环炮、并发并最基础的12连环炮,建议先阅读:连环炮继续走起,今天我给大家总结了线程池的12连环炮。1、为什么要创建线程池?2、创建线程池有哪些方式?3、Executors能创建几种常用线程池?4、线程池有哪些参数?5,能说说线程池原理吗?6、线程池有哪些拒绝策......
  • MX Linux 23 Beta 正式发布,基于 Debian 12 “Bookworm”
    MX Linux 是一个基于Debian稳定版的中量级Linux操作系统,使用antiX的核心组件,以及由MX社区创建或打包的额外软件。MXLinux23“Libretto”版本的Beta版本已发布,MXLinux23基于即将推出的Debian12“书虫”操作系统系列,由长期支持的Linux6.1LTS内核......
  • MX Linux 23 Beta 正式发布,基于 Debian 12 “Bookworm”
    MX Linux 是一个基于Debian稳定版的中量级Linux操作系统,使用antiX的核心组件,以及由MX社区创建或打包的额外软件。MXLinux23“Libretto”版本的Beta版本已发布,MXLinux23基于即将推出的Debian12“书虫”操作系统系列,由长期支持的Linux6.1LTS内核......
  • MX Linux 23 Beta 正式发布,基于 Debian 12 “Bookworm”
    MX Linux 是一个基于Debian稳定版的中量级Linux操作系统,使用antiX的核心组件,以及由MX社区创建或打包的额外软件。MXLinux23“Libretto”版本的Beta版本已发布,MXLinux23基于即将推出的Debian12“书虫”操作系统系列,由长期支持的Linux6.1LTS内核......