• 【设计模式】Java设计模式 - 享元模式


    【设计模式】Java设计模式 - 享元模式

    😄 不断学习才是王道
    🔥 继续踏上学习之路,学之分享笔记
    👊 总有一天我也能像各位大佬一样
    🏆 一个有梦有戏的人 @怒放吧德德
    🌝分享学习心得,欢迎指正,大家一起学习成长!

    请添加图片描述

    简介

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

    享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
                                                                                                                                                        ———— 菜鸟联盟
    UML图:
    在这里插入图片描述

    主要角色

    1.抽象享元角色(Flyweight)

    享元对象抽象基类或者接口,同时定义出对象的外部状态和内部状态的接口或实现。

    2.具体享元角色(ConcreteFlyweight)

    实现抽象角色定义的业务。该角色的内部状态处理应该与环境无关,不能出现会有一个操作改变内部状态,同时修改了外部状态。

    3.不可同享角色(UnConcreteFlyweight)

    一般不会出现在享元工厂中

    4.享元工厂(FlyweightFactory)

    负责管理享元对象池和创建享元对象,提供容器池,同时提供获取对象方法。

    内部状态和外部状态

    • 享元模式提供了两个要求:细粒度和共享对象。
    • 外部状态:对象得以依赖的一个标记,是随着环境的变换而变化,不可共享的状态。
    • 内部状态:对象共享出来的信息,存在享元对象内部且不会随着环境的变化而变化。

    实例

    本次采用图书馆借书的案例来理解享元模式,形式很简单,首先定义一个抽象类,里面有个抽象方法,接着定义子类来继承抽象类,并实现其方法。为了模拟外部状态,还需定义一个用户实体类。构建工厂来作为池存放对象,并暴露获取对象的方法。最后通过调用方法。
    类图:
    在这里插入图片描述

    ①、抽象类的定义

    只有一个借书的方法

    package com.lyd.demo.flyweight;
    import com.lyd.demo.entity.User;
    /**
     * @Author: lyd
     * @Description: 图书馆 - 抽象类
     * @Date: 2022-09-01
     */
    public abstract class Library {
        public abstract void borrow(User user); // 抽象方法 - 借书
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ②、抽象类的子类

    实现抽象方法

    package com.lyd.demo.flyweight;
    import com.lyd.demo.entity.User;
    /**
     * @Author: lyd
     * @Description: 具体子类
     * @Date: 2022-09-01
     */
    public class LibraryImpl extends Library {
        private String name; // 书名 - 内部状态
        public LibraryImpl(String name) {
            this.name = name;
        }
        @Override
        public void borrow(User user) {
            System.out.println("图书馆的书《" + name + "》已被[" + user.getName() + "]借出");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    ③、外部状态 - User实体类

    package com.lyd.demo.entity;
    /**
     * @Author: lyd
     * @Description: 实体 - user - 模拟 外部状态
     * @Date: 2022-09-01
     */
    public class User {
        private String name;
        public User(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    ④、工厂类

    用Map集合来充当缓冲池,存放对象,并且提供获取对象的方法,为了方便观察享元模式的作用,还有个获取对象池中对象数量。

    package com.lyd.demo.factory;
    import com.lyd.demo.flyweight.Library;
    import com.lyd.demo.flyweight.LibraryImpl;
    import java.util.HashMap;
    /**
     * @Author: lyd
     * @Description: 工厂类
     * @Date: 2022-09-01
     */
    public class LibraryFactory {
        // 用集合来充当缓存池,暂存书籍
        private HashMap<String, LibraryImpl> pool = new HashMap<String, LibraryImpl>();
        // 如果有书籍就放入缓存
        public Library getLibraryImpl(String name) {
            if (!pool.containsKey(name)) {
                // 创建一个放入
                pool.put(name, new LibraryImpl(name));
            }
            return pool.get(name);
        }
        // 获取书籍个数
        public int bookCount() {
            return pool.size();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    ⑤、测试

    通过工厂类调用获得对象,再去调用借书方法,采用两种不用角色和不同数据来演绎享元模式的案例实现。

    package com.lyd.demo.test;
    
    import com.lyd.demo.entity.User;
    import com.lyd.demo.factory.LibraryFactory;
    import com.lyd.demo.flyweight.Library;
    
    /**
     * @Author: lyd
     * @Description: 测试类
     * @Date: 2022-09-01
     */
    public class FlyWeightTest {
        public static void main(String[] args) {
            // 创建工厂
            LibraryFactory libraryFactory = new LibraryFactory();
            Library book = libraryFactory.getLibraryImpl("Java设计模式");
            book.borrow(new User("怒放吧德德"));
    
            // 假设书已经归还
    
            Library book2 = libraryFactory.getLibraryImpl("Java设计模式");
            book2.borrow(new User("愤怒吧德德"));
    
            Library book3 = libraryFactory.getLibraryImpl("Go语言编程");
            book3.borrow(new User("怒放吧德德"));
    
            System.out.println("现在有书:" + libraryFactory.bookCount() + " 本");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    运行结果:
    在这里插入图片描述

    好文推荐

    👍创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!👍

  • 相关阅读:
    SSH工具:Xshell正版官方免费版下载,不限制站点数量
    【Java 基础篇】Java 文件及文件夹操作详解
    数字图像1-opencv c++基本操作
    金蝶云星空和旺店通·企业版单据接口对接
    maven 重复依赖不同版本 选择规则
    第37讲:MySQL索引结构之B-Tree和B+Tree数据结构的概念
    安全测试概述和用例设计
    JWT 使用入门(一)配置与示例
    【vue2+onlyoffice】基础预览demo运行+问题解决
    [Python]Django 视图(View)和URL 与 模板(Template)
  • 原文地址:https://blog.csdn.net/qq_43843951/article/details/126652458