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

Java设计模式 - 享元模式

😄 不断学习才是王道
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🏆原创作品,更多关注我CSDN: 一个有梦有戏的人
👊准备将博客园、CSDN一起记录分享自己的学习心得!!!
🌝分享学习心得,欢迎指正,大家一起学习成长!

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

简介

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

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
                                                                                                                                                    ———— 菜鸟联盟
UML图:
【设计模式】Java设计模式 - 享元模式

主要角色

1.抽象享元角色(Flyweight)

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

2.具体享元角色(ConcreteFlyweight)

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

3.不可同享角色(UnConcreteFlyweight)

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

4.享元工厂(FlyweightFactory)

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

内部状态和外部状态

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

实例

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

①、抽象类的定义

只有一个借书的方法

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); // 抽象方法 - 借书 } 

②、抽象类的子类

实现抽象方法

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() + "]借出");     } } 

③、外部状态 - 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;     } } 

④、工厂类

用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();     } } 

⑤、测试

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

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() + " 本");     } } 

运行结果:
【设计模式】Java设计模式 - 享元模式

好文推荐

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

发表评论

评论已关闭。

相关文章