GOF:运用共享技术有效地支持大量细粒度的对象。
解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说(这里引用GOF书中的例子)一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。
在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多,下面举个例子:
先定义一个抽象的Flyweight类:
package Flyweight; public abstract class Flyweight ... { public abstract void operation(); }//end abstract class Flyweight |
在实现一个具体类:
package Flyweight; public class ConcreteFlyweight extends Flyweight ... { private String string; public ConcreteFlyweight(String str) ... { string = str; }//end ConcreteFlyweight(...) public void operation() ... { System.out.println("Concrete---Flyweight : " + string); }//end operation() }//end class ConcreteFlyweight |
实现一个工厂方法类:
package Flyweight; import java.util.Hashtable; public class FlyweightFactory ... { private Hashtable flyweights = new Hashtable();//----------------------------1 public FlyweightFactory() ...{} public Flyweight getFlyWeight(Object obj) ... { Flyweight flyweight = (Flyweight) flyweights.get(obj);//----------------2 if(flyweight == null) ...{//---------------------------------------------------3 //产生新的ConcreteFlyweight flyweight = new ConcreteFlyweight((String)obj); flyweights.put(obj, flyweight);//--------------------------------------5 } return flyweight;//---------------------------------------------------------6 }//end GetFlyWeight(...) public int getFlyweightSize() ... { return flyweights.size(); } }//end class FlyweightFactory |
这个工厂方法类非常关键,这里详细解释一下:
在1处定义了一个Hashtable用来存储各个对象;在2处选出要实例化的对象,在6处将该对象返回,如果在Hashtable中没有要选择的对象,此时变量flyweight为null,产生一个新的flyweight存储在Hashtable中,并将该对象返回。
最后看看Flyweight的调用:
package Flyweight; import java.util.Hashtable; public class FlyweightPattern ...{ FlyweightFactory factory = new FlyweightFactory(); Flyweight fly1; Flyweight fly2; Flyweight fly3; Flyweight fly4; Flyweight fly5; Flyweight fly6; /** *//** Creates a new instance of FlyweightPattern */ public FlyweightPattern() ...{ fly1 = factory.getFlyWeight("Google"); fly2 = factory.getFlyWeight("Qutr"); fly3 = factory.getFlyWeight("Google"); fly4 = factory.getFlyWeight("Google"); fly5 = factory.getFlyWeight("Google"); fly6 = factory.getFlyWeight("Google"); }//end FlyweightPattern() public void showFlyweight() ... { fly1.operation(); fly2.operation(); fly3.operation(); fly4.operation(); fly5.operation(); fly6.operation(); int objSize = factory.getFlyweightSize(); System.out.println("objSize = " + objSize); }//end showFlyweight() public static void main(String[] args) ... { System.out.println("The FlyWeight Pattern!"); FlyweightPattern fp = new FlyweightPattern(); fp.showFlyweight(); }//end main(...) }//end class FlyweightPattern |
下面是运行结果:
Concrete---Flyweight : Google Concrete---Flyweight : Qutr Concrete---Flyweight : Google Concrete---Flyweight : Google Concrete---Flyweight : Google Concrete---Flyweight : Google objSize = 2 |
我们定义了6个对象,其中有5个是相同的,按照Flyweight模式的定义“Google”应该共享一个对象,在实际的对象数中我们可以看出实际的对象却是只有2个。
下面给出一个简易的UML图:
String a = "hello"; String b = "hello"; if(a == b) System.out.println("OK"); else System.out.println("Error"); |
总结:
Flyweight(享元)模式是如此的重要,因为它能帮你在一个复杂的系统中大量的节省内存空间。在GOF的书中举了文本处理的例子,我觉得非常恰当。那么,在Java中String这个类型比较特殊,为什么呢,看下面的例子:
输出结果是:OK。稍有经验的人都可以看出if条件比较的是两a和b的地址,也可以说是内存空间。那么Sting的实现是不是使用了Flyweight模式呢,其实String内部也维护了一个共享池 对于一些经常使用的 就可以放在里面 减少内存的开销。
核心总结,可以共享的对象,也就是说返回的同一类型的对象其实是同一实例,当客户端要求生成一个对象时,工厂会检测是否存在此对象的实例,如果存在那么直接返回此对象实例,如果不存在就创建一个并保存起来,这点有些单例模式的意思。通常工厂类会有一个集合类型的成员变量来用以保存对象,如hashtable,vector等。在java中,数据库连接池,线程池等即是用享元模式的应用。
相关推荐
JAVA-设计模式-结构型模式-享元模式
java常用设计模式-享元模式
本资源主要介绍了JAVA设计模式的原则和23种设计模式的总结。设计模式是软件设计中的一种解决方案,能够使软件系统更加灵活、可维护和可扩展。本资源首先介绍了设计模式的六大原则,包括单一责任原则、开闭原则、里氏...
在软件工程中,设计模式是一种被广泛接受的解决特定设计问题的...因此,深入学习和理解Java设计模式对于任何Java开发者来说都是至关重要的。通过文档中的图解和代码示例,读者可以更好地理解和掌握这些模式的实际应用。
并整理二十三种设计模式的理论部分,综合汇总成这份Java 设计模式(疯狂J*va 联盟版),希望对大家有所帮助。 本份帮助文档主要是为了向读者介绍二十三种设计模式,包括模式的描述, 适用性,模*的组成部分,并附带...
Java设计模式是软件工程中的一种重要思想,它代表了在解决特定问题时的最佳实践。这些模式都是经过时间和经验验证的设计解决方案,可以提高代码的可读性、可维护性和复用性。Java设计模式主要分为三类:创建型模式、...
Java设计模式详解 Java设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 设计模式的六大原则...
设计模式之享元模式 设计模式之享元模式 设计模式之享元模式
java设计模式【之】享元模式【源码】【场景:多缓存可选模式】 /** * 享元模式(预加载单例) * “元” 理解为 “同一地址对象” * 运用共享技术,减少对象的创建,降低对象的数量,降低内存消耗,提高性能 * ...
本课程适合所有需要弥补JAVA设计模式的同学,课件内容制作精细,由浅入深,适合入门或进行知识回顾。 【完整课程列表】 基于java程序语言的设计java模式课程 01-设计模式概述(共36页).pptx 基于java程序语言的...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、可维护性和灵活性。本教程详细介绍了23种经典的Java设计模式,包括创建型、结构型和行为型模式。下面将对这...
1.2.6 享元模式 32 1.2.7 代理模式 34 1.3 行为型模式 37 1.3.1 责任链模式 37 1.3.2 命令模式 40 1.3.3 解释器模式 43 1.3.4 迭代器模式 45 1.3.5 中介者模式 49 1.3.6 备忘录模式 52 1.3.7 观察者模式 54 1.3.8 ...
设计模式-享元模式 设计模式是软件设计中的一种解决方案,旨在提高代码的可维护性、灵活性和可重用性。享元模式(Flyweight Pattern)是结构型模式的一种,主要用于减少大量相似对象的内存占用,提高系统的性能和...
计算机后端-Java-图解java设计模式089 享元模式(4)-Inte.avi
搜集整理的享元模式基本概念
计算机后端-Java-图解java设计模式086 享元模式(1).avi
计算机后端-Java-图解java设计模式087 享元模式(2).avi
计算机后端-Java-图解java设计模式088 享元模式(3).avi
计算机后端-Java-图解java设计模式090 享元模式(5).avi
设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy...