首页 > 其他分享 >Flyweight Pattern —— Creational Class

Flyweight Pattern —— Creational Class

时间:2023-09-05 14:56:47浏览次数:39  
标签:享元 创建 对象 Pattern Flyweight ConcreteFlyweight public Creational

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

What is Flyweight Pattern

Flyweight 是指轻量级的。

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

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

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

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

Comparison between prototype and Flyweight

Similarities:

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

Differences:

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

Key elements

  • 细颗粒类接口
  • 细颗粒类实现
  • 创建细颗粒类工厂
  • Client

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中。之后,如果再次请求相同的享元对象,则直接返回已经创建的对象。这样就实现了对象的共享,减少了内存消耗。

希望这个简单的示例能帮助你理解享元模式的基本概念和用法。

标签:享元,创建,对象,Pattern,Flyweight,ConcreteFlyweight,public,Creational
From: https://www.cnblogs.com/mysticbinary/p/17679469.html

相关文章

  • Factory Pattern —— Creational Class
    core工厂模式(FactoryPattern)是一种创建型设计模式,用于创建对象而不暴露对象创建的逻辑。它将对象的实例化过程封装在一个工厂类中,客户端通过调用工厂类的方法来创建对象,从而实现了解耦和灵活性。工厂模式的核心思想是将对象的创建与使用分离。客户端不直接实例化对象,而是通过调......
  • 20230626 java.util.regex.Pattern
    介绍java.util.regex.PatternpublicfinalclassPatternimplementsjava.io.Serializable正则表达式的编译表示API常量flagUNIX_LINES启用UNIX行模式在多行模式中匹配^和$时,只有\n被识别成行终止符CASE_INSENSITIVE不区分大小写匹配字符时忽略字母的......
  • Visitor Pattern-访问者模式
    C#中的访问者模式(VisitorPattern)是一种行为型设计模式,它将数据结构和数据操作分离,使得可以在不修改数据结构的前提下定义新的操作。访问者模式的核心思想是将数据结构和数据操作解耦,将数据操作封装到独立的访问者类中。数据结构定义一组元素,每个元素接受访问者的访问并调用相应......
  • Strategy Pattern-策略模式
    C#中的策略模式(StrategyPattern)是一种行为型设计模式,它可以让你定义一族算法,并将每个算法封装起来,使它们可以相互替换,从而使得算法的变化独立于使用算法的客户端。策略模式的核心思想是将算法的定义和使用分离,将不同的算法封装到独立的策略类中。这样,客户端可以根据需求从不同的......
  • StatePattern-状态模式
    C#中的状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。状态模式的核心思想是将对象的行为封装在不同的状态类中,对象根据当前状态的不同而执行不同的行为。在C#中,实现状态模式通常需要以下几个参与者:状态接口(StateInterface):定义了表示不同状态的方法......
  • SAP ABAP 模式(Pattern)、模板的创建与调用
    1.代码模板2.模式(Pattern) 调用3.标准模式,一些内置固定格式代码的填充  ......
  • IteratorPattern-迭代器模式
    在C#中,迭代器模式(IteratorPattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露聚合对象的内部表示。迭代器模式有以下几个关键角色:Iterator(迭代器):定义访问和遍历元素的接口。ConcreteIterator(具体迭代器):实现迭代器接口,实现对聚合对象的......
  • CommandPattern-命令模式
    在C#中,命令模式(CommandPattern)是一种行为型设计模式,它将请求封装成一个对象,这样可以让请求的发送者和接收者解耦,并且可以对请求进行参数化、队列化、记录日志、撤销等操作。命令模式有以下几个关键角色:Command(命令):定义了执行操作的接口,通常包括一个执行方法。ConcreteCommand(......
  • ChainOfResponsibilityPattern-责任链模式
    在C#中,责任链模式(ChainofResponsibilityPattern)是一种行为型设计模式,它可让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。请求沿着一个链传递,直到有一个对象处理它为止。责任链模式有以下几个关键角色:Handler(处理器):定义处理请求的接口,并通常持有一......
  • TemplateMethodPattern-模板方法模式
    在C#中,模板方法模式(TemplateMethodPattern)是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤延迟到子类中实现。模板方法模式通过将公共的算法步骤抽象到基类中,并且通过在基类中定义一个模板方法来调用这些步骤,从而实现代码的复用和灵活性。模板方法模式有以下几个关键角......