Flyweight Pattern —— Creational Class

这篇具有很好参考价值的文章主要介绍了Flyweight Pattern —— Creational Class。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

享元模式在主流的标准里是放到结构大类下的,但是我感觉这个模式的最终作用也是为了获取一个类,所以我将其划分到创建大类下。

What is Flyweight Pattern

Flyweight 是指轻量级的。

享元模式旨在支持大量细粒度的对象共享,以减少内存消耗。该模式通过共享相似对象的部分状态,来减少对象的数量。通过共享,可以节省内存并提高系统的性能。

享元模式通常涉及两个关键概念:

  • 内部状态(Intrinsic State)
    内部状态是可以共享的部分,存储在享元对象内部;
  • 外部状态(Extrinsic State)
    外部状态是不可共享的部分,需要在使用时提供。

通过将内部状态与外部状态分离,可以实现对象的共享。享元模式适用于需要创建大量相似对象且内存消耗较大的场景。

Think:
这个模式给我最大的启发就是,一些大量且要耗费大量资源,即使它本身是一个整体,也要考虑继续将它细分,更细粒度的管控它,这个细分的手段就是设置一个状态。 这个思想也广泛的运用在IT的各个领域,比如说>>TODO。

Q:享元模式是通过在类里面设置状态,达到控制类的目的吗?

A:不完全正确。享元模式是一种结构设计模式,其主要目的是通过共享对象来减少内存使用和提高性能。它通过将对象的状态划分为内部状态(Intrinsic State)和外部状态(Extrinsic State)来实现。

内部状态是可以被多个对象共享的状态,它不依赖于具体的场景或上下文,可以在多个对象之间共享和复用。而外部状态是随着具体的场景或上下文变化的状态,它不能被共享,需要在使用时传递给享元对象。

通过将内部状态和外部状态分离,享元模式可以大幅减少系统中对象的数量,从而节省内存空间。而通过传递外部状态,可以使得享元对象在不同的场景中具有不同的行为,从而实现灵活性。

因此,尽管享元模式可以通过内部状态和外部状态的设置来控制类的行为,但其核心目的并不是通过状态的设置来控制类,而是通过共享对象和分离状态来提高内存利用和性能。

Comparison between prototype and Flyweight

Similarities:

  • 从场景上来看都是为了节省资源区创建大量相似的对象;
  • 一般都是配合工厂模式;

Differences:

  • Flyweight 如果需要创建不同的对象,就得提供不同的外部状态;
  • Prototype 无需依赖于显式的构造函数,它通过复制现有对象的原型来创建新对象。

Key Elements

  • 享元类接口
  • 享元类实现
  • 获取享元类工厂

Simple Example

当你使用享元模式时,你需要定义一个享元工厂(Flyweight Factory),它负责创建和管理享元对象。下面是一个简单的Java代码示例,演示了如何实现享元模式:

首先,我们定义享元接口(Flyweight):

public interface Flyweight {
    void operation();
}

然后,实现具体的享元类(ConcreteFlyweight):

public class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void operation() {
        System.out.println("ConcreteFlyweight: " + intrinsicState);
    }
}

接下来,创建享元工厂类(FlyweightFactory)来管理享元对象:

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

public class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (flyweights.containsKey(key)) {
            return flyweights.get(key);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
            return flyweight;
        }
    }
}

最后,我们可以使用享元工厂来获取享元对象并调用其方法:

public class Main {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        Flyweight flyweight1 = factory.getFlyweight("A");
        flyweight1.operation();

        Flyweight flyweight2 = factory.getFlyweight("B");
        flyweight2.operation();

        Flyweight flyweight3 = factory.getFlyweight("A");
        flyweight3.operation();

        // 输出结果:
        // ConcreteFlyweight: A
        // ConcreteFlyweight: B
        // ConcreteFlyweight: A
    }
}

在上述示例中,我们使用享元工厂来获取享元对象。首次获取某个享元对象时,工厂会创建一个新的对象并将其存储在内部的HashMap中。之后,如果再次请求相同的享元对象,则直接返回已经创建的对象。这样就实现了对象的共享,减少了内存消耗。

希望这个简单的示例能帮助你理解享元模式的基本概念和用法。文章来源地址https://www.toymoban.com/news/detail-695025.html

到了这里,关于Flyweight Pattern —— Creational Class的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Prototype Pattern —— Creational Class

    在Java中,Cloneable 接口是一个标记接口(Marker Interface,它们内部都没有方法和属性),实现Cloneable接口表示该对象能被克隆,能使用Object.clone()方法。 要实现克隆功能,需要满足以下两个条件: 类实现了 Cloneable 接口。 在类中重写 clone() 方法。 为了方便记忆,原型模式也叫

    2024年02月11日
    浏览(30)
  • 设计模式-享元模式(Flyweight)

    享元模式(Flyweight Pattern)是一种结构型设计模式,它的主要目标是减少应用程序中对象的数量,以节省内存和提高性能。这一模式适用于对象数量庞大且相似的情况,通过共享内部状态来减少对象的创建。 在本篇博客中,我们将详细介绍享元模式的概念,并提供一个简单的

    2024年02月09日
    浏览(31)
  • 【设计模式-08】Flyweight享元模式

    简要的理解:享元模式就是新建一个池(Pool),该池子(Pool)中有新建好的一堆对象,当需要使用时,从池子(Pool)中直接获取,不用重新新建一个对象。通俗的讲就是: 共享元数据 。 比如Java中的String就是使用享元模式,String的值存储在一个内存池中,不用每次分配一个内存存储

    2024年01月21日
    浏览(34)
  • 设计模式——1_5 享元(Flyweight)

    今人不见古时月,今月曾经照古人 ——李白 运用共享技术有效地支持大量颗粒度对象 享元 真是一个非常非常优秀的翻译 如果你单看 四人组 对享元的定义,那很容易就会把他理解成类似 连接池 那种对对象进行共享的模式。但是如果享元就是对对象池的管理的话,那他的元

    2024年01月22日
    浏览(29)
  • 【设计模式——学习笔记】23种设计模式——享元模式Flyweight(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    你的公司主要做一些小型的外包项目,之前给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求有些不同 有客户要求以新闻的形式发布 有客户要求以博客的形式发布 有客户要求以微信公众号的形式发布 【 传统方式】 直接复制

    2024年02月15日
    浏览(35)
  • 创建型模式 (Creational Patterns) 玄子Share 设计模式 GOF 全23种 + 七大设计原则

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWLAOFtO-1691793071647)(./assets/%E7%8E%84%E5%AD%90Share%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20GOF%20%E5%85%A823%E7%A7%8D%20+%20%E4%B8%83%E5%A4%A7%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.png)] GoF(Gang of Four)是四位计算机科学家(Erich Gamma、Ri

    2024年02月12日
    浏览(26)
  • Builder Pattern —— Structure Class

    建造者模式又称为 生成器模式 ,主要用于对复杂对象的构建、初始化,它可以 将多个简单的组件对象按顺序一步步组装起来 , 最终构建成一个复杂的成品对象 。 与工厂系列模式不同的是,建造者模式的主要目的在于把烦琐的 构建过程 从不同对象中抽离出来,使其脱离并

    2024年02月10日
    浏览(25)
  • Template Pattern —— Behavioral Class

    钩子方法(Hook Method)之所以被称为“钩子”,是因为它在算法或流程中提供了一个“钩子”,允许子类在特定的点上“钩入”自己的实现逻辑,从而影响算法的行为或流程的执行。 它类似于一个挂钩、锚点,所以叫Hook method, 它允许子类插入自定义的代码来改变或扩展算法的

    2024年02月10日
    浏览(30)
  • Strategy Pattern and Polymorphism —— Behavioral Class

    策略模式很类似现在多功能的洗衣机,每次在洗衣服之前,都需要由用户自己选择想要的洗衣策略,洗衣机收到指定的洗衣策略后,组合成一份新的算法和数据结构才去执行。 策略模式和状态模式的区别在于使用者对它们的 目的 。 策略模式主要用于实现算法的选择和动态切

    2024年02月12日
    浏览(36)
  • 构型模式-享元模式

    描述 通过共享已经存在的对象来减少对象的数量,从而提高系统的性能和效率。这种方式可以避免重复创建对象,同时也能够降低内存消耗。 适用环境 当需要创建大量细粒度的对象时使用;对象的状态可以被多个对象共享时使用。 优点: 可以大幅度减少系统中对象的数量

    2023年04月16日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包