Java设计模式-享元模式(Flyweight Pattern)

简介: Java设计模式-享元模式(Flyweight Pattern)

文章目录

前言

享元模式比较简单,为了提供对象的复用率,减少创建对象的数量,消耗内存,降低效率。如线程池,数据库连接池等,需要创建连接,直接从连接池中进行获取,能够提高效率。

一、享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。

二、使用步骤

1.创建一个存对象的类

/**

* 设置一个患者对象

*/

public class RequestContext extends ThreadLocal{

   private static Hashtable props = new Hashtable();

   /**

    * 设置属性的方法

    * @param s

    * @param obj

    */

   public static void setProperty(String s, Object obj)

   {

       props.put(s, obj);

   }

   /**

    * 获取属性

    * @param s

    * @return

    */

   public static Object getProperty(String s)

   {

       return props.get(s);

   }

   /**

    * 移除属性

    * @param s

    */

   public static void removeProperty(String s)

   {

       props.remove(s);

   }

   /**

    * 清除所有的属性

    */

   public static void clear()

   {

       props.clear();

   }

}

2.存放的对象类

定义一个代理对象,存放在定义存放对象类里边。

/**

* 代理对象

*/

public class ProxyObject {

   private String name;

   public ProxyObject(String name) {

       System.out.print("创建新对象:"+name);

       this.name = name;

   }

   public String getName() {

       return name;

   }

   public void setName(String name) {

       this.name = name;

   }

   @Override

   public String toString() {

       return "ProxyObject{" +

               "name='" + name + '\'' +

               '}';

   }

}

3 测试

/**

* 测试享元模式

*/

public class Client {

   public static void main(String[] args) {

       Random random = new Random();

       //利用

       for (int i = 1;i < 10; i++){

           int j = random.nextInt(10);

           ProxyObject property = (ProxyObject) RequestContext.getProperty(j+"");

           if (property==null){

               ProxyObject newProxyObject = new ProxyObject(j+"");

               //放入hashtable

               RequestContext.setProperty(j+"",newProxyObject);

               System.out.println("  " +newProxyObject);

           }else {

               System.out.println("已经存在对象:"+property);

           }

       }

   }

}

打印输出

创建新对象:2  ProxyObject{name='2'}

创建新对象:3  ProxyObject{name='3'}

创建新对象:7  ProxyObject{name='7'}

创建新对象:4  ProxyObject{name='4'}

已经存在对象:ProxyObject{name='4'}

已经存在对象:ProxyObject{name='4'}

已经存在对象:ProxyObject{name='7'}

创建新对象:6  ProxyObject{name='6'}

创建新对象:1  ProxyObject{name='1'}

总结

提供类的复用率,减少对象的创建,应该考虑使用享元模式。


相关文章
|
14天前
|
设计模式 存储 缓存
「全网最细 + 实战源码案例」设计模式——享元模式
享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少大量相似对象的内存消耗。通过分离对象的内部状态(可共享、不变)和外部状态(依赖环境、变化),它有效减少了内存使用。适用于存在大量相似对象且需节省内存的场景。模式优点包括节省内存和提高性能,但会增加系统复杂性。实现时需将对象成员变量拆分为内在和外在状态,并通过工厂类管理享元对象。
147 83
|
3月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
3月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
56 4
|
4月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
92 0
[Java]23种设计模式
|
3月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
110 0
|
4月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
4月前
|
设计模式 Java
Java设计模式
Java设计模式
58 0
|
4月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
47 0
|
Java 索引 API
java Pattern和Matcher详解
结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一种最基础最简单的匹配。 java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(
1549 0
|
2天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
33 14

热门文章

最新文章