FACTOID # 19: Single guys should check out The Virgin Islands, where the women outnumber the men.
 
 Home   Encyclopedia   Statistics   Countries A-Z   Flags   Maps   Education   Forum   FAQ   About 
 
WHAT'S NEW
RECENT ARTICLES
More Recent Articles »
 

FACTS & STATISTICS    Simple view

  1. Select countries to view: (hold down Control key and click to select several)

     

     

    Compare:

     

     

  1. Select fact or statistic: (* = graphable)

     

     

     

  2. (OPTIONAL) Compare to statistic: (both need to be graphable)

     

     

     

  3. View result as:

     

       
(OR) SEARCH ALL encyclopedia, stats & forums:   

Encyclopedia > Flyweight pattern

Flyweight is a software design pattern. A Flyweight is an object that minimizes memory occupation by sharing as much data as possible with other similar objects; it is a way to use objects in large numbers when a simple representation would use an unacceptable amount of memory. Often some parts of the object state cannot be shared and it's common to put them in external data structures and pass them to the flyweight objects temporarily when they are used. In software engineering, a design pattern is a general repeatable solution to a commonly occurring problem in software design. ...


A classic example usage of the flyweight pattern are the data structures for graphical representation of characters in a word processor. It would be nice to have, for each character in a document, a glyph object containing its font outline, font metrics, and other formatting data, but it would amount to hundreds or thousands of bytes for each character. Instead, for every character there might be a reference to a flyweight glyph object shared by every instance of the same character in the document; only the position of each character (in the document and/or the page) would need to be stored externally. A word processor (also more formally known as a document preparation system) is a computer application used for the production (including composition, editing, formatting, and possibly printing) of any sort of viewable or printed material. ... For referencing in Wikipedia, see Wikipedia:Citing sources. ...

Contents

Examples

The following programs illustrate the document example given above: the flyweights are called FontData in the Java example and GraphicChar in the C# example.


Java

 public enum FontEffect { BOLD, ITALIC, SUPERSCRIPT, SUBSCRIPT, STRIKETHROUGH } public final class FontData { /** * A weak hash map will drop unused references to FontData. * Values have to be wrapped in WeakReferences, * because value objects in weak hash map are held by strong references. */ private static final WeakHashMap<FontData, WeakReference<FontData>> flyweightData = new WeakHashMap<FontData, WeakReference<FontData>>(); private final int pointSize; private final String fontFace; private final Color color; private final Set<FontEffect> effects; private FontData(int pointSize, String fontFace, Color color, EnumSet<FontEffect> effects) { this.pointSize = pointSize; this.fontFace = fontFace; this.color = color; this.effects = Collections.unmodifiableSet(effects); } public static FontData create(int pointSize, String fontFace, Color color, FontEffect... effects) { EnumSet<FontEffect> effectsSet = EnumSet.noneOf(FontEffect.class); for (FontEffect fontEffect : effects) { effectsSet.add(fontEffect); } // We are unconcerned with object creation cost, we are reducing overall memory consumption FontData data = new FontData(pointSize, fontFace, color, effectsSet); if (!flyweightData.containsKey(data)) { flyweightData.put(data, new WeakReference(data)); } // return the single immutable copy with the given values return flyweightData.get(data).get(); } @Override public boolean equals(Object obj) { if (obj instanceof FontData) { if (obj == this) { return true; } FontData other = (FontData) obj; return other.pointSize == pointSize && other.fontFace.equals(fontFace) && other.color.equals(color) && other.effects.equals(effects); } return false; } @Override public int hashCode() { return (pointSize * 37 + effects.hashCode() * 13) * fontFace.hashCode(); } // Getters for the font data, but no setters. FontData is immutable. } 

C#

 using System.Collections; using System.Collections.Generic; using System; class GraphicChar { char c; string fontFace; public GraphicChar(char c, string fontFace) { this.c = c; this.fontFace = fontFace; } public static void printAtPosition(GraphicChar c, int x, int y) { Console.WriteLine("Printing '" + c.c + "' in '{1}' at position {2}:{3}.", c.c, c.fontFace, x, y); } } class GraphicCharFactory { Hashtable pool = new Hashtable(); // the Flyweights public int getNum() { return pool.Count; } public GraphicChar get(char c, string fontFace) { GraphicChar gc; string key = c.ToString() + fontFace; gc = (GraphicChar)pool[key]; if (gc == null) { gc = new GraphicChar(c, fontFace); pool.Add(key, gc); } return gc; } } class FlyWeightExample { public static void Main(string[] args) { GraphicCharFactory cf = new GraphicCharFactory(); // Compose the text by storing the characters as objects. List<GraphicChar> text = new List<GraphicChar>(); text.Add(cf.get('H', "Arial")); // 'H' and "Arial" are called intrinsic information text.Add(cf.get('e', "Arial")); // because it is stored in the object itself. text.Add(cf.get('l', "Arial")); text.Add(cf.get('l', "Arial")); text.Add(cf.get('o', "Times")); // See how the Flyweight approach is beginning to save space: Console.WriteLine("CharFactory created only {0} objects for {1} characters.", cf.getNum(), text.Count); int x=0, y=0; foreach (GraphicChar c in text) { // Passing position as extrinsic information to the objects, GraphicChar.printAtPosition(c, x++, y); // as a top-left 'A' is not different to a top-right one. } } } 

External links

  • Flyweight pattern discussion with 1-page examples by Vince Huston

  Results from FactBites:
 
Design Pattern Synopses (4381 words)
The Filter pattern is a special case of the Decorator pattern, where a data source or data sink object is wrapped to add logic to the handling of a data stream.
The Composite pattern also allows the objects in the tree to be manipulated in a consistent manner, by requiring all of the objects in the tree to have a common superclass or interface.
The Flyweight pattern is often combined with the Composite pattern to represent the leaf nodes of a hierarchical structure with shared objects.
Flyweight (660 words)
The Flyweight pattern describes how to share objects to allow their use at fine granularities without prohibitive cost.
Flyweight suggests removing the // non-shareable state from the class, and having // the client supply it when methods are called.
Flyweight is often combined with Composite to implement shared leaf nodes.
  More results at FactBites »


 

COMMENTARY     


Share your thoughts, questions and commentary here
Your name
Your comments
Please enter the 5-letter protection code

Want to know more?
Search encyclopedia, statistics and forums:

 


Lesson Plans | Student Area | Student FAQ | Reviews | Press Releases |  Feeds | Contact
The Wikipedia article included on this page is licensed under the GFDL.
Images may be subject to relevant owners' copyright.
All other elements are (c) copyright NationMaster.com 2003-5. All Rights Reserved.
Usage implies agreement with terms.