Java设计模式之结构型-享元模式(UML类图+案例分析)

这篇具有很好参考价值的文章主要介绍了Java设计模式之结构型-享元模式(UML类图+案例分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基本概念

二、UML类图

三、角色设计

四、案例分析

4.1、基本实现

4.2、游戏角色

五、总结


一、基本概念

享元模式是一种结构型设计模式,主要用于减少创建大量相似对象所占用的内存,它通过共享技术来有效支持大量细粒度的对象。

二、UML类图

Java设计模式之结构型-享元模式(UML类图+案例分析),Java,设计模式,java,享元模式,设计模式

三、角色设计

角色 描述
抽象享元角色 定义出对象的外部状态和内部状态的接口或属性。
具体享元角色 实现抽象享元角色,定义内部状态,可以保存共享对象的状态
享元工厂角色 负责创建和管理享元对象
客户端角色 存储外部状态,在需要时通过享元工厂获取享元对象

四、案例分析

享元模式中的享元对象可以认为是一种可复用的组件。比如在游戏中,有许多类型相同的敌人,这时就可以使用享元模式。

1、我们会创建一个享元工厂类,这个类就像一个存放享元对象的仓库。客户端需要对象时,就来这个工厂类这里取。

2、工厂类存放的是享元对象。享元对象有两种状态:内部状态与外部状态。

内部状态是对象共享的部分,不会改变,比如敌人的形状、颜色等。

外部状态是对象依赖的可变部分,比如敌人的位置。

3、当客户端需要一个享元对象时,会先从工厂请求。 

如果工厂里已有该对象,就直接返回已有实例,复用该对象。 

如果没有,则创建新实例,并存入工厂后返回。

4、客户端拿到对象后,将外部状态设置给该对象,然后显示。

5、对象使用完后并不销毁,而是返还给工厂继续复用。这样通过管理可复用的享元对象,就可以大量减少对象的创建,节省内存空间,提高性能。

本篇共举了2个简单的小案例进行分析,可以更好的去理解这个设计模式。

4.1、基本实现

首先定义一个享元接口并声明了一个操作方法:

interface Flyweight {

    void operate(String extrinsicState);

}

创建具体的享元类,实现享元接口,并包含内部状态: 

class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;
 
    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }
 
    public void operate(String extrinsicState) {
        System.out.println("内部状态: " + intrinsicState);
        System.out.println("外部状态: " + extrinsicState);
        // 执行享元操作
    }
}

创建享元工厂类,用于管理和共享享元对象: 

import java.util.HashMap;
import java.util.Map;
 
class FlyweightFactory {
    private Map<String, Flyweight> flyweights;
 
    public FlyweightFactory() {
        flyweights = new HashMap<>();
    }
 
    public Flyweight getFlyweight(String intrinsicState) {
        if (flyweights.containsKey(intrinsicState)) {
            return flyweights.get(intrinsicState);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(intrinsicState);
            flyweights.put(intrinsicState, flyweight);
            return flyweight;
        }
    }
}

在客户端中使用享元工厂类来获取和使用享元对象:

public class Client {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
 
        // 获取或创建享元对象
        Flyweight flyweight1 = factory.getFlyweight("SharedState");
        Flyweight flyweight2 = factory.getFlyweight("SharedState");
 
        // 使用享元对象
        flyweight1.operate("ExtrinsicState1");
        flyweight2.operate("ExtrinsicState2");
    }
}

运行结果如下:

Java设计模式之结构型-享元模式(UML类图+案例分析),Java,设计模式,java,享元模式,设计模式

4.2、游戏角色

我们举一个形象一些的例子,游戏中需要显示大量的相似的敌人角色,这时就可以使用享元模式复用对象以减少内存开销。

定义角色(抽象享元角色)接口:

public interface GameRole {

    void display(String name);
}

具体角色(具体享元角色)实现:

public class Enemy implements GameRole {

    private String type;

    public Enemy(String type){
        this.type = type;
    }

    @Override
    public void display(String attackType) {
        System.out.println(type+"敌人已启用!"+"攻击方式:"+attackType);
    }
}

角色工厂(享元工厂角色)实现:

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

public class RoleFactory {

  private Map<String, GameRole> pool;

  public RoleFactory() {
    pool = new HashMap<>();
  }

  GameRole getRole(String type) {
    if(!pool.containsKey(type)) {
      pool.put(type, new Enemy(type)); 
    }
    return pool.get(type);
  }
}

客户端:

public class Client {

    public static void main(String[] args) {
        RoleFactory factory = new RoleFactory();
        GameRole a = factory.getRole("A");
        GameRole b = factory.getRole("B");
        a.display("boom");
        b.display("fly");

    }
}

运行结果如下:

Java设计模式之结构型-享元模式(UML类图+案例分析),Java,设计模式,java,享元模式,设计模式

五、总结

优点:

1、减少内存占用,降低系统资源消耗。

2、提高系统性能。

缺点:

1、增加了系统的复杂度;

2、区分内部状态和外部状态可能会很复杂;

3、享元模式使得系统难以维护和扩展。

应用场景:

1、一个应用程序使用大量的相似对象。

2、对象的大多数状态都可以外部化。

3、在内存是关键资源的系统中。

4、系统要求消除大量相似类的重复对象。

例如游戏设计中复用相同的角色对象、网站设计的外观样式、多线程池中的线程对象等都适合使用享元模式。

符合的设计原则:

1、单一职责原则(Single Responsibility Principle)

享元模式分离了内部状态和外部状态。

2、开闭原则(Open Close Principle)

新增享元对象不影响其他对象。

3、组合复用原则(Composite Reuse Principle)

享元对象可以被组合、聚合。文章来源地址https://www.toymoban.com/news/detail-570765.html

到了这里,关于Java设计模式之结构型-享元模式(UML类图+案例分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 设计模式之享元模式【结构型模式】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博

    2024年01月25日
    浏览(33)
  • 设计模式(十二):结构型之享元模式

    设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式(七):结构型之适配器模式 设计模式(八):结构型之装

    2024年02月08日
    浏览(43)
  • [设计模式 Go实现] 结构型~享元模式

    享元模式从对象中剥离出不发生改变且多个实例需要的重复数据,独立出一个享元,使多个对象共享,从而节省内存以及减少对象数量。 flyweight.go flyweight_test.go

    2024年01月16日
    浏览(30)
  • 笨蛋学设计模式结构型模式-享元模式【13】

    7.7.1概念 ​ 享元模式是通过共享对象减少内存使用,来提高程序性能。在此模式中,分为内部状态和外部状态,其中相似的对象被存储在享元对象内部,并对于所有享元对象都是相同的,且状态通常是不变的。只在需要时内部共享,而不是每次创建新的对象。而外部状态是享

    2024年01月23日
    浏览(31)
  • 【结构型设计模式】C#设计模式之享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过尽可能共享对象来减少内存使用和提高性能。它将对象分为两种类型:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是可以共享的,而外部状态是独立于享元对象的,并且在使用时需要注入。 使用

    2024年02月13日
    浏览(27)
  • 【设计模式】第13节:结构型模式之“享元模式”

    所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。 实现:通过工厂模式,在工厂类中,通过一个Map或者List来缓存已经创建好的享元对象,以达到复用的目的。把实例的共享状态和不共享状态分开。 以下是画

    2024年02月08日
    浏览(29)
  • 【Java 设计模式】结构型之桥接模式

    桥接模式(Bridge Pattern)是一种结构型设计模式, 它将抽象部分与实现部分分离,使它们可以独立变化,从而降低它们之间的耦合 。桥接模式通过将抽象部分和实现部分分离,使得它们可以独立地变化,同时在它们之间建立一个桥梁。在本文中,我们将介绍 Java 中桥接模式的

    2024年01月19日
    浏览(38)
  • 【Java 设计模式】结构型之外观模式

    外观模式(Facade Pattern)是一种结构型设计模式, 它为复杂系统提供了一个简化的接口,隐藏了系统的复杂性,使得客户端更容易使用系统 。外观模式通过创建一个包装类(外观类),将系统的复杂性封装起来,对客户端提供一个简单的接口。在本文中,我们将深入研究Ja

    2024年01月21日
    浏览(36)
  • 【Java 设计模式】结构型之代理模式

    代理模式(Proxy Pattern)是一种结构型设计模式, 它允许通过一个代理对象控制对其他对象的访问 。代理模式在访问对象时引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的操作。在本文中,我们将深入研究Java中代理模式的定义、结构、使用场景以及如何在

    2024年01月21日
    浏览(38)
  • Java学习——设计模式——结构型模式2

    结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来实现更灵活的功能。 包括: 1、适配器 2、桥接 3、组合 4、装

    2024年02月03日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包