Java设计模式之享元模式(Flyweight Pattern)详解

 更新时间:2023年07月07日 11:04:05   作者:小威要向诸佬学习呀  
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少对象的数量,以节省内存空间和提高性能,本文将详细的给大家介绍一下Java享元模式,需要的朋友可以参考下

享元模式概念

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少对象的数量,以节省内存空间和提高性能。它通过共享相同或相似状态的多个对象来减少对象的数量。享元模式通常用于大量创建细粒度对象的场景。

享元模式使用场景

在享元模式中,我们创建一个工厂类(Flyweight Factory),该工厂类对外提供获取享元对象的方法。享元对象包含两部分属性:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态指不随外界环境改变而改变的共享部分,外部状态指随着环境的改变而改变的部分。

当客户端需要一个享元对象时,它向工厂类请求一个对象,工厂类会首先查询对象池中是否已经有该对象的实例。如果有,就直接返回对象池中的实例;如果没有,则创建一个新的实例并将其放入对象池中,同时返回给客户端。

享元模式优缺点

享元模式的优点在于,它可以大大减少系统中对象的数量,从而提高系统的性能和内存利用率。它也可以使得代码更加简洁,易于维护和扩展。

但是,享元模式也有一些缺点,在某些情况下,它可能会牺牲部分内存以换取性能的提升。同时,由于享元对象通常是不可变的对象,因此可能会对系统中的某些业务逻辑造成影响。

享元模式代码案例

下面以一个具体例子,比如制作黑白棋游戏来进一步说明:

对于黑白棋这个游戏来说,我们需要大量的棋子对象,如果为每一个棋子都单独创建一个对象,那么系统的性能和内存开销都会非常大。而使用享元模式,我们可以将一些相同的棋子对象共享起来,只需要保存其内部和外部状态区分即可。例如,黑方和白方用不同颜色的棋子,但同一颜色的棋子之间是可以互相替换的。

定义棋子类Piece

public interface Piece {
    void put(int x, int y);
}
public class BlackPiece implements Piece {
    @Override
    public void put(int x, int y) {
        System.out.println("在坐标 (" + x + ", " + y + ") 放置了一个黑棋子");
    }
}
public class WhitePiece implements Piece {
    @Override
    public void put(int x, int y) {
        System.out.println("在坐标 (" + x + ", " + y + ") 放置了一个白棋子");
    }
}

以上代码实现了两个具体的棋子类:BlackPiece 和 WhitePiece。它们都实现了 Piece 接口,并重写了其中的 put() 方法,用于在指定坐标放棋子。

实现享元工厂类PieceFactory

import java.util.HashMap;
import java.util.Map;
public class PieceFactory {
    private final Map<String, Piece> map = new HashMap<>();
    public Piece getPiece(String color) {
        Piece piece = map.get(color);
        if (piece == null) {
            switch (color) {
                case "black":
                    piece = new BlackPiece();
                    break;
                case "white":
                    piece = new WhitePiece();
                    break;
                default:
                    throw new IllegalArgumentException("Unsupported color: " + color);
            }
            map.put(color, piece);
        }
        return piece;
    }
}

以上代码实现了一个操作棋子对象的共享工厂PieceFactory,其中使用了HashMap来保存已经创建过的棋子对象。直接调用getPiece()方法即可根据颜色获取相应的棋子对象。如果该颜色的棋子对象不存在,则创建一个新的棋子对象并存入map中,否则直接从map中获取棋子对象。

在客户端中使用享元模式

public class Client {
    public static void main(String[] args) {
        PieceFactory factory = new PieceFactory();
        Piece black1 = factory.getPiece("black");
        black1.put(1, 1);
        Piece black2 = factory.getPiece("black");
        black2.put(2, 2);
        Piece white1 = factory.getPiece("white");
        white1.put(3, 3);
        Piece white2 = factory.getPiece("white");
        white2.put(4, 4);
    }
}

在上面的代码中,我们可以看到一个完整的享元模式实现。在客户端中,我们只需要获取工厂类中提供的共享对象即可,通过调用 put() 方法来为棋子设置坐标。

通过以上例子,我们可以看出享元模式的优点:它大幅度减少内存占用并提高了系统性能,对于类似的大量重复对象的场景非常友好

到此这篇关于Java设计模式之享元模式(Flyweight Pattern)详解的文章就介绍到这了,更多相关Java 享元模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈servlet与jsp的关系

    浅谈servlet与jsp的关系

    本文主要介绍了servlet与jsp的相关知识,并总结出servlet与jsp之间的关系,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • java使用CollectionUtils工具类判断集合是否为空方式

    java使用CollectionUtils工具类判断集合是否为空方式

    这篇文章主要介绍了java使用CollectionUtils工具类判断集合是否为空方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java class文件格式之常量池_动力节点Java学院整理

    Java class文件格式之常量池_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java class文件格式之常量池的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java线性结构中栈、队列和串的基本概念和特点详解

    Java线性结构中栈、队列和串的基本概念和特点详解

    前几天小编给大家介绍了Java线性结构中的链表,除了链表这种结构之外,实际上还有栈、队列、串等结构,那么这些结构又有哪些特点呢,本文就给大家详细的介绍一下,感兴趣的小伙伴跟着小编一起来看看吧
    2023-07-07
  • spring-boot实现增加自定义filter(新)

    spring-boot实现增加自定义filter(新)

    本篇文章主要介绍了spring-boot实现增加自定义filter(新),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java9新特性对HTTP2协议支持与非阻塞HTTP API

    Java9新特性对HTTP2协议支持与非阻塞HTTP API

    这篇文章主要为大家介绍了Java9新特性对HTTP2协议的支持与非阻塞HTTP API,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java简单实现动态代理模式过程解析

    Java简单实现动态代理模式过程解析

    这篇文章主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Spring boot异步任务原理全面分析

    Spring boot异步任务原理全面分析

    这篇文章主要介绍了Spring boot异步任务原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • struts2中simple主题下<s:fieldError>标签默认样式的移除方法

    struts2中simple主题下<s:fieldError>标签默认样式的移除方法

    这篇文章主要给大家介绍了关于struts2中simple主题下<s:fieldError>标签默认样式的移除方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-10-10
  • SpringBoot中获取profile的方法详解

    SpringBoot中获取profile的方法详解

    这篇文章主要介绍了springboot获取profile的操作,文中的示例代码讲解详细,具有很好的参考价值,希望对大家有所帮助
    2022-04-04

最新评论