【HeadFirst 设计模式学习笔记】15 享元模式拾零

简介:

这个模式也是这本书中没有详细阐明的,其实这个模式多多少少有点单例模式+简单工厂模式的意味。在Java 中,String对象就是用享元模式进行管理的——Java将所有固定的String都放在了一个常量池中,相同的String只保存一份拷贝——这个带来的好处是显而易见的,内存占用和创建对象的开销都随之降低——这个模式适用于常用的细粒度可共享对象的创建。

我们设想一个问题场景:在一个预约程序中用于表达时间的类Time

  1: public class Time {
  2:    private byte hour;
  3:    private byte minute;
  4: 
  5:    public Time(byte hour, byte minute) {
  6:       this.hour = hour;
  7:       this.minute = minute;
  8:    }
  9: 
 10:    public byte hour() {
 11:       return hour;
 12:    }
 13: 
 14:    public byte minute() {
 15:       return minute;
 16:    }
 17: 
 18:    public String toString() {
 19:       return hour + ":" + minute;
 20:    }
 21: }
 22: 

在一个程序中可能用到这个类非常多次,而且如果小时和分钟相同的话,其实这个类产生的内存对象是可以共享而不影响功能的。尤其是这个应用场景中,预约的时间往往不是正点就是半点,最多可能是15分、45分这样的时间,如果能共享内存则会明显省去很多的内存对象。

这个共享内存的操作是由一个简单工厂方法提供的,在这个类中维护了一个HashMap,完成了类似内存池的功能,若在hashmap中没有该时间的话就new一个time对象,然后放入其中以便以后维护,若有的话则直接返回那个对象即可:

  1: public class TimeFactory {
  2:    private static Map
     
     
       times = 
     
     new HashMap
     
     
      ();

     
     </STRING,TIME></STRING,TIME>
  3:    public static Time create(byte hour, byte minute) {
  4:       String key = hour + ":" + minute;
  5:       Time time = times.get(key);
  6:       if (time == null) {
  7:          time = new Time(hour, minute);
  8:          times.put(key, time);
  9:       }
 10:       return time;
 11:    }
 12: }

最后,我们看一下这个UML图:

flyweightpattern

在这个UML图中,Flywright做了进一步的抽象,UnsharedConcreteFlyWeight类和ConcreteFlyweight类继承与Flyweight类(定义了抽象方法Operation),这两个类的不同点在于FlyweightFactory只维护了ConcreteFlyweight,而对UnsharedConcreteFlyWeight则不参与。其实UnsharedConcreteFlyWeight并非是享元模式必须的类,放在这里只是一个抽象的需要,它的创建就是使用普通的new操作。




本文转自gnuhpc博客园博客,原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/21/2827625.html,如需转载请自行联系原作者

相关文章
|
2月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
33 2
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
47 0
|
2月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
32 0
|
3月前
|
设计模式 Java
Java设计模式-享元模式(12)
Java设计模式-享元模式(12)
|
4月前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
5月前
|
设计模式 Java
Head First设计模式学习笔记
Head First设计模式学习笔记
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
1月前
|
设计模式 安全 Java
Kotlin - 改良设计模式 - 构建者模式
Kotlin - 改良设计模式 - 构建者模式