首页 > 其他分享 >22-享元模式

22-享元模式

时间:2023-03-03 10:46:25浏览次数:41  
标签:享元 03 22 gof 模式 User flyweight public

22-享元模式

概念

享元模式(flyweight),运用共享技术有效地支撑大量细粒度的对象

享元模式可以避免大量非常相似的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。

使用场景:
如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑享元模式

实践

package com.gof.flyweight;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
@Data
@AllArgsConstructor
public class User {

    private String account;

}
package com.gof.flyweight;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
public abstract class Website {
    public abstract void use(User user);
}
package com.gof.flyweight;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
public class ConcreteWebsite extends Website {
    private String name;

    public ConcreteWebsite(String name) {
        this.name = name;
    }

    @Override
    public void use(User user) {
        System.out.println("网站分类:" + name + " 用户:" + user.getAccount());
    }
}
package com.gof.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
public class WebsiteFactory {
    private Map<String, Website> websites = new HashMap<>();

    public Website getWebsite(String type) {
        if (websites.containsKey(type)) {
            return websites.get(type);
        } else {
            ConcreteWebsite concreteWebsite = new ConcreteWebsite(type);
            websites.put(type, concreteWebsite);
            return concreteWebsite;
        }
    }

    public int getWebsiteCount() {
        return websites.size();
    }
}
package com.gof.flyweight;

/**
 * 功能描述
 *
 * @since 2023-03-03
 */
public class Client {
    public static void main(String[] args) {
        User user1 = new User("小菜");
        User user2 = new User("大鸟");

        WebsiteFactory factory = new WebsiteFactory();
        Website wx = factory.getWebsite("产品展示");
        wx.use(user1);
        Website wy = factory.getWebsite("产品展示");
        wy.use(user2);
    }
}

标签:享元,03,22,gof,模式,User,flyweight,public
From: https://www.cnblogs.com/Oh-mydream/p/17174710.html

相关文章

  • 关于解决UEditor源码模式下提交保存样式 样式是乱的
             问题1这个项目的UEditor是用来编辑页面的 每个页面又有不同的模块 然而业务部门有时候是会直接从别的模块直接复制源代码然后在可视模式......
  • 装饰模式
    概述《设计模式》一书中对于“装饰模式”的动机描述如下:动态地给一个对象添加一些额外的职责按照SOLID面向对象编程原则中的O(开闭原则),对于功能的修改应当关闭,而......
  • 创建型:工厂模式-简单工厂
    定义之所以叫简单工厂是因为真的非常简单,只要一个工厂(函数)就可以了,如果把被创建的对象称为产品,把创建产品的对象或者方法称为工厂,那么只需要传入不同的参数,就可以......
  • 每日记录(十)2022.03.02
    今天学了很多,主要有网页的制作,但是不太熟练,明天继续    今天吃了铁板炒饭,味道还行,,我觉得那个鸡蛋还可以加点味道,不然不太好吃。晚上吃了麻辣烫,我发现学二食堂的麻......
  • SYUCT2022综合训练1
    2022级综合训练本次训练三道题目都为codeforces上原题。1.BinaryDecimal题解:多尝试几组数据不难看出题目所求为,所有位数上最大的一个值.#include<bits/stdc++.......
  • 456. 132 模式
    给你一个整数数组nums,数组中共有n个整数。132模式的子序列由三个整数nums[i]、nums[j]和nums[k]组成,并同时满足:i<j<k和nums[i]<nums[k]<nums[j]。......
  • 2022.3.2周四每日博客
    今天实现了单表的jdbc连接数据库增删改查,并开始向多表实现增删改查逐步靠拢由于·身体抱恙,一直处于发烧状态,下午请假没有去上体育课,在宿舍睡了一身汗今天没有花大量时间......
  • Codeforces Round #850 (Div. 2, based on VK Cup 2022 - Final Round)
    Preface补题,之前由于要准备开学考(其实只是临时抱佛脚罢了),所以好久没写题不过索性学校题目简单,微积分线代C程都满绩了(甚至溢出好多),思政被卡了一分满绩点,而大英不出所料3.7......
  • 软件体系架构方面英文文章翻译----Android中MVC、MVP和MVVM架构模式的区别
    DifferenceBetweenMVC,MVPandMVVMArchitecturePatterninAndroid22Dec,2022Developinganandroidapplicationbyapplyingasoftwarearchitecturepattern......
  • 设计模式3——结构型模式
    结构型模式描述如何将类或对象按某种布局组成更大的结构,它分为类结构型和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象。由于组合关系或聚......