墨风如雪博客

  • 源码小店
  • 传家宝VPS
让AI使用变得如此简单
  1. 首页
  2. java
  3. 设计模式
  4. 正文

设计模式:享元设计模式

2023年 5月 11日 509点热度 0人点赞 0条评论

享元设计模式介绍

享元设计模式是一种结构型设计模式,它旨在减少系统中对象的数量,以减少内存占用和提高性能。该模式通过共享对象来避免创建大量相似的对象,从而减少内存占用和提高系统的性能。

在享元模式中,对象被分为两种类型:内部状态和外部状态。内部状态是对象的固有属性,可以被多个对象共享,而外部状态则是对象的可变属性,每个对象都具有不同的值。通过共享内部状态,可以减少系统中对象的数量,从而减少内存占用。而通过将外部状态作为参数传递给对象的方法,可以使多个对象共享相同的内部状态,同时又能保持各自的独立性。

享元模式的主要优点包括:

  1. 减少内存占用:通过共享对象,可以减少系统中对象的数量,从而减少内存占用。
  2. 提高系统性能:由于减少了对象的数量,系统的性能也得到了提高。
  3. 增加系统的灵活性:通过将外部状态作为参数传递给对象的方法,可以使多个对象共享相同的内部状态,同时又能保持各自的独立性。

享元模式的主要缺点包括:

  1. 可能会导致代码复杂性增加:由于需要将对象分为内部状态和外部状态,可能会导致代码复杂性增加。
  2. 可能会影响系统的安全性:如果多个对象共享相同的内部状态,那么对于该状态的修改可能会影响到其他对象的行为,从而影响系统的安全性。

适用场景:

  1. 系统中存在大量相似的对象,并且这些对象可以共享一些固有属性时,可以使用享元模式。
  2. 系统需要频繁创建和销毁对象,并且创建和销毁对象的代价很高时,可以使用享元模式。
  3. 系统需要缓存对象,以便多个客户端共享相同的数据时,可以使用享元模式。

spring当中的使用

在Spring框架中,享元设计模式被广泛应用,其中最常见的应用是Spring的BeanFactory和ApplicationContext接口。这些接口使用了享元模式来管理和共享bean对象,以便减少内存占用和提高系统性能。

例如,我们可以使用Spring的BeanFactory接口来加载和管理Spring应用程序中的所有bean,同时使用ApplicationContext接口来共享这些bean对象。下面是一个使用Spring的享元模式的例子:

// 定义一个接口
public interface MessageService {
    String getMessage();
}

// 实现接口
public class MessageServiceImpl implements MessageService {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

// 使用享元模式管理bean对象
public class Application {
    public static void main(String[] args) {
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
        MessageService service1 = factory.getBean("messageService", MessageService.class);
        MessageService service2 = factory.getBean("messageService", MessageService.class);

        System.out.println(service1 == service2); // 输出 true,说明 service1 和 service2 是同一个对象

        ((MessageServiceImpl)service1).setMessage("Hello World!");
        System.out.println(service2.getMessage()); // 输出 "Hello World!",说明 service1 和 service2 共享了相同的对象
    }
}

在这个例子中,我们定义了一个接口MessageService和其实现类MessageServiceImpl。然后,我们使用Spring的BeanFactory接口来加载和管理MessageServiceImpl类的bean对象。由于Spring使用了享元模式来管理bean对象,因此我们可以通过两次调用factory.getBean()方法来获取同一个bean对象。最后,在客户端应用程序中,我们使用两个不同的变量service1和service2来引用同一个bean对象,并将一个字符串设置为message属性。由于service1和service2共享了相同的对象,因此我们可以通过service2来获取message属性的值。

通过Spring的BeanFactory和ApplicationContext接口,我们可以轻松地使用享元模式来管理和共享bean对象,以便减少内存占用和提高系统性能。

模拟面试题

面试题:请简要解释享元模式是什么以及它的优点和缺点,并给出一个JAVA代码实现。

解答:

享元模式是一种结构型设计模式,它旨在减少系统中对象的数量,以减少内存占用和提高性能。在享元模式中,对象被分为两种类型:内部状态和外部状态。内部状态是对象的固有属性,可以被多个对象共享,而外部状态则是对象的可变属性,每个对象都具有不同的值。通过共享内部状态,可以减少系统中对象的数量,从而减少内存占用和提高系统的性能。

享元模式的优点包括:

  1. 减少内存占用:通过共享对象,可以减少系统中对象的数量,从而减少内存占用。
  2. 提高系统性能:由于减少了对象的数量,系统的性能也得到了提高。
  3. 增加系统的灵活性:通过将外部状态作为参数传递给对象的方法,可以使多个对象共享相同的内部状态,同时又能保持各自的独立性。

享元模式的缺点包括:

  1. 可能会导致代码复杂性增加:由于需要将对象分为内部状态和外部状态,可能会导致代码复杂性增加。
  2. 可能会影响系统的安全性:如果多个对象共享相同的内部状态,那么对于该状态的修改可能会影响到其他对象的行为,从而影响系统的安全性。

下面是一个JAVA代码实现享元模式的例子:

// 定义一个接口
interface Shape {
    void draw();
}

// 实现接口
class Circle implements Shape {
    private String color;

    public Circle(String color) {
        this.color = color;
    }

    public void draw() {
        System.out.println("Drawing Circle with color " + color);
    }
}

// 定义一个工厂类
class ShapeFactory {
    private static final Map<String, Shape> circleMap = new HashMap<>();

    public static Shape getCircle(String color) {
        Shape circle = circleMap.get(color);

        if (circle == null) {
            circle = new Circle(color);
            circleMap.put(color, circle);
            System.out.println("Creating circle of color : " + color);
        }

        return circle;
    }
}

// 使用工厂类
public class FlyweightPatternDemo {
    private static final String[] colors = {"Red", "Green", "Blue", "White", "Black"};

    public static void main(String[] args) {
        for (int i = 0; i < 20; ++i) {
            Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());
            circle.draw();
        }
    }

    private static String getRandomColor() {
        return colors[(int) (Math.random() * colors.length)];
    }
}

在这个例子中,我们定义了一个接口Shape和其实现类Circle。然后,我们创建了一个工厂类ShapeFactory,它使用一个Map来存储Circle对象,并通过内部状态color来共享这些对象。最后,在客户端应用程序中,我们使用ShapeFactory类来获取Circle对象,并随机生成颜色。由于使用了享元模式,在20次循环中,我们只创建了5个Circle对象,从而减少了内存占用和提高了性能。

通过这个例子,我们可以看到如何使用享元模式来减少系统中对象的数量,以减少内存占用和提高性能。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java 享元 介绍 设计模式
最后更新:2023年 5月 10日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
Kimi K2.5开源:自带百人众包团队,月之暗面重新定义生产力 告别修图软件的图层噩梦,腾讯混元3.0让AI学会了“思考” 参数仅100亿却硬刚千亿巨头:阶跃星辰Step3-VL-10B凭什么封神? 腾讯CodeBuddy 2.0:从“副驾驶”到“全栈合伙人”的进化 97毫秒极致响应!Qwen3-TTS开源,重新定义语音生成的“速度与激情” 2026开年王炸:文心5.0带着2.4万亿参数和原生全模态来了
闭源的墙角被挖塌了?GLM-4.7登顶开源王座,这回真不兴嘲讽仅需1GB内存!腾讯混元MT1.5开源,让手机翻译彻底告别云端依赖十天谈下二十亿美金:Meta豪掷千金买下的中国AI天才,到底凭什么?智谱ZCode上手:把Claude和Gemini装进桌面,编程还能这么玩?告别延迟!通义开源Fun-Audio-Chat,这才是我们要的语音AI这可能是最懂人话的AI:阿里MAI-UI让手机自动驾驶成真
Grok 4.1:马斯克AI的里程碑式飞跃,它到底有多强? 30亿参数逆袭!MonkeyOCR-3B如何革新文档解析? 破壁者:DeepSeek EP如何打通AI大模型的效率革命 掌握java 面向对象编程的关键:类、对象、继承、多态和封装 AI圈炸锅!OpenAI发布o3和o4-mini:不止聪明,更能“看图思考”和自主干活了? java 数据库连接池技术Apache Commons DBCP的(超详细总结)
标签聚合
大模型 教程 java AI 设计模式 spring 算法 deepseek

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang