• 享元模式Flyweight


    Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。

    Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况成立时使用Flyweight模式:

    1 一个应用程序使用了大量的对象。

    2 完全由于使用大量的对象,造成很大的存储开销。

    3 对象的大多数状态都可以变为外部状态。

    4 如果删除对象以外的状态那么可以用相对较少的共享对象取代很多组对象。

    5 应用程序不依赖于对象标识。

    package com.qinsoft.design;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 享元模式--结构型
     */
    abstract class Order
    {
        // 执行卖出动作
        public abstract void sell();
    }
    
    class FlavorOrder extends Order
    {
        public String flavor;
        // 获取咖啡口味
        public FlavorOrder(String flavor)
        {
            this.flavor = flavor;
        }
        @Override
        public void sell()
        {
            System.out.println("卖出一份" + flavor + "的咖啡。");
        }
    }
    
    class FlavorFactory
    {
    
        private Map<String, Order> flavorPool = new HashMap<String, Order>();
        // 静态工厂,负责生成订单对象
        private static FlavorFactory flavorFactory = new FlavorFactory();
    
        private FlavorFactory()
        {
        }
        public static FlavorFactory getInstance()
        {
            return flavorFactory;
        }
    
        public Order getOrder(String flavor)
        {
            Order order = null;
            if (flavorPool.containsKey(flavor))
            {// 如果此映射包含指定键的映射关系,则返回 true
                order = flavorPool.get(flavor);
            } else
            {
                order = new FlavorOrder(flavor);
                flavorPool.put(flavor, order);
            }
            return order;
        }
    
        public int getTotalFlavorsMade()
        {
            return flavorPool.size();
        }
    }
    
    public class Flyweight
    {
    
        // 客户下的订单
        private static List<Order> orders = new ArrayList<Order>();
        // 订单对象生成工厂
        private static FlavorFactory flavorFactory;
    
        // 增加订单
        private static void takeOrders(String flavor)
        {
            orders.add(flavorFactory.getOrder(flavor));
        }
    
        public static void main(String[] args)
        {
            // 订单生成工厂
            flavorFactory = FlavorFactory.getInstance();
            // 增加订单
            takeOrders("摩卡");
            takeOrders("卡布奇诺");
            takeOrders("香草星冰乐");
            takeOrders("香草星冰乐");
            takeOrders("拿铁");
            takeOrders("卡布奇诺");
            takeOrders("拿铁");
            takeOrders("卡布奇诺");
            takeOrders("摩卡");
            takeOrders("香草星冰乐");
            takeOrders("卡布奇诺");
            takeOrders("摩卡");
            takeOrders("香草星冰乐");
            takeOrders("拿铁");
            takeOrders("拿铁");
            //卖咖啡
            for (Order order : orders)
            {
                order.sell();
            }
            // 打印生成的订单java对象数量
            System.out.println("\n客户一共买了 " + orders.size() + " 杯咖啡! ");
            // 打印生成的订单java对象数量
            System.out.println("共生成了 " + flavorFactory.getTotalFlavorsMade() + " 个 FlavorOrder java对象! ");
        }
    }
  • 相关阅读:
    我已经迷失在事件环(eventloop)中了【Nodejs篇】
    canvas练手项目(二)——各种操作基础
    canvas练手项目(三)——Canvas中的Text文本
    canvas练手项目(一)——选取图片
    迭代器,生成器(generator)和Promise的“微妙”关系
    通过HTTP的HEADER完成各种骚操作
    这份Koa的简易Router手敲指南请收下
    KOA的简易模板引擎实现方式
    扒一扒PROMISE的原理,大家不要怕!
    参考KOA,5步手写一款粗糙的web框架
  • 原文地址:https://www.cnblogs.com/hnhcc39/p/2966062.html
Copyright © 2020-2023  润新知