首页 > 其他分享 >20230430 26. 享元模式 - 网站复用

20230430 26. 享元模式 - 网站复用

时间:2023-06-22 14:55:26浏览次数:39  
标签:享元 category 20230430 26 User WebSite new public

介绍

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

享元模式

在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了。

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

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

代码示例

Flyweight

/**
 * 网站
 */
public abstract class WebSite {
    public abstract void use(User user);
}

Flyweight 实现类

public class ConcreteWebSite extends WebSite {
    private String category;

    public ConcreteWebSite(String category) {
        this.category = category;
    }

    @Override
    public void use(User user) {
        System.out.println("网站分类:" + category + " 用户:" + user.getName());
    }
}

FlyweightFactory

/**
 * 网站工厂
 */
public class WebSiteFactory {
    private HashMap<String, WebSite> flyweights = new HashMap<>();

    public WebSite getWebSiteCategory(String category) {
        if (!flyweights.containsKey(category)) {
            flyweights.put(category, new ConcreteWebSite(category));
        }
        return flyweights.get(category);
    }

    /**
     * 获得网站分类总数
     */
    public int getWebSiteCount() {
        return flyweights.size();
    }
}

外部状态

/**
 * 用户
 *
 */
@Data
@AllArgsConstructor
public class User {
    private String name;
}

客户端

public class Test {
    public static void main(String[] args) {
        WebSiteFactory factory = new WebSiteFactory();
        WebSite webSite1 = factory.getWebSiteCategory("博客");
        webSite1.use(new User("x"));

        WebSite webSite2 = factory.getWebSiteCategory("博客");
        webSite1.use(new User("y"));

        System.out.println(webSite1 == webSite2);


        WebSite webSite3 = factory.getWebSiteCategory("产品展示");
        webSite3.use(new User("z"));

    }
}

标签:享元,category,20230430,26,User,WebSite,new,public
From: https://www.cnblogs.com/huangwenjie/p/17490421.html

相关文章

  • 20230430 27. 解释器模式 - 音符
    解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器......
  • 洛谷 P8264 [Ynoi Easy Round 2020] TEST_100
    题目Link我们不妨来考虑所有询问都是\(l=1,r=n\)的情形,这种情况下需要对每个值处理出他经过一系列变换后变成了什么数。考虑用\(\text{solve}(p,l,r)\)表示我们现在要计算\(x\in[l,r]\)的这些数在经过\(x\leftarrow|x-a_p|,x\leftarrow|x-a_{p+1}|\),一直到\(x\leftar......
  • 代码随想录算法训练营第十三天| 层序遍历 226.翻转二叉树 (优先掌握递归) 101. 对
    层序遍历注意:1,使用队列的形式,依次入队,同时对队列进行计数2,知道数目消失,才进行下一个队列代码:1vector<vector<int>>levelOrder(TreeNode*root)2{3vector<vector<int>>result;4if(root==NULL)returnresult;5queue<TreeNode*>selected;6......
  • h265编码是什么意思,H265的编码和H264的编码有什么区别,视频编码h.264和mpeg4的对比
    MPEG-4标准则是基于对象和内容的编码方式,和传统的图像帧编码方式不同,它只处理图像帧与帧之间的差异元素,抛弃相同图像元素,因此大大减少了合成多媒体文件的体积,从而以较小的文件体积同样可得到高清晰的还原图像。换句话说,相同的原始图像,MPEG-4编码标准具有更高的压缩比。H.264编码技......
  • 最完美WIN11_Pro_22H2.22631.1900软件选装纯净版VIP50.3
    【系统简介】=============================================================1.本次更新母盘来自UUP_WIN11_PRO_22H2.22631.1900。进一步精简优化调整。2.只为呈现最好的作品,手工精简优化部分较多。3.OS版本号为22631.1900。个别要求高的就下MSDN吧,里面啥功能都有。4.集成《DrvCeo......
  • 每日一题力扣 1262 https://leetcode.cn/problems/greatest-sum-divisible-by-three/
    、 题解这道题目核心就算是要知道如果x%3=2的话,应该要去拿%3=1的数字,这样子才能满足%3=0贪心sum不够%3的时候,就减去余数为1的或者余数为2的需要注意两个余数为1会变成余数为2的,所以可能减去2个余数为1核心代码如下publicintmaxSumDivThreeOther(int[]nums){​  ......
  • k8s1.26.3部署
    1.设置hostnamehostnamectlset-hostnamek8s-master//master节点hostnamectlset-hostnamek8s-node1//node1节点hostnamectlset-hostnamek8s-node2//node2节点2.设置hosts后续可以使用别名直接访问别的节点cat>>/etc/hosts<<EOF192.168.100.40k8s-master192.......
  • L26_用日语表达多种感想
    语料的视频观看地址概述在日语中,需要在一个句子中需要使用两个或者两个以上的形容词表达多样的感受时,可以采用"物品名称形容词て形,…形容词"的语法结构。比如:この卵(たまご)焼き、甘くて、美味しいですい形容词的て形变化:词尾的い变为て美味しい=>美味しく美味的甘......
  • 背包DP-贪心-1262. 可被三整除的最大和
    1262.可被三整除的最大和DescriptionDifficulty:1762RelatedTopics:贪心,数组,动态规划,排序给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。示例1:输入:nums=[3,6,5,1,8]输出:18解释:选出数字3,6,1和8,它们的和是18(可被3整除的最大和)。示......
  • 1262. 可被三整除的最大和
    给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/greatest-sum-divisible-by-three著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。classSolution{publicintmaxSumDivThree(in......