XMLPatterns.com

Home

Introduction

Patterns
Categorized
Alphabetical
Chronological

Books

Links

About
Flyweight
Printable Version

Abstract:

If the same information is included at many different points in a document the information can be placed in just one place, and shared from each place in the document that needs to refer to it.


Problem:

Placing the same information in many different place can cause several problems:
  • Mistakes can be made in copying the information
  • If the data changes, all occurrences of the information must be located and changed. This makes maintenance of the document difficult.
  • Documents can become quite large if the same information is repeated over and over again.


Context:

This is a very general pattern, almost any document type can make use of it. This pattern can be used anywhere where the same information must be repeated more than once in a document. The repeated data can occur in the document declaration, or in the document instance itself.


Forces:

This pattern can effect the length of the document, maintainability, and readability of the document.


Solution:

Place the shared information in just one place, and make references to it from every place in the document that needs to include this information. There are several ways to do this:
  • Use XML Entity Declarations. These provide a way to do text substitutions inside of a document. The XML Specification Section 4.2 Entity Declarations
  • Use the XLink attribute xlink:show="embed". This technique has the advantage of using a standard, so some tools may be available to do the processing. This is defined in The W3C's XML Linking Language Specification
  • Use ID and IDREF attributes. A reference can be made to an entity via an IDREF attribute. Applications processing this will need to do the processing to do this type of Flyweight.
See the Examples section for an example of each of the above techniques.


Examples:

XML Entities
This example shows how XML Entities can be used to put a piece of information in just one place, and then have it appear in multiple places in the document.
                              

<!DOCTYPE Doc[
<!ENTITY TITLE "My Document">
]>
<Document>
<title>&TITLE;</title>
<H1>&TITLE;</H1>
This is my paragraph.
</Document>

                              
                            

XLink
This document shows the use of XLink attributes to include the contents of a document in two different places. Since XLink is a standard it is possible that existing tools could be used to do the substitution.
                              

<Document>
<title>
<include xlink:show="embed"
xlink:href="titledoc.txt"/>
</title>
<h1>
<include xlink:show="embed"
xlink:href="titledoc.txt"/>
</h1>
This is my paragraph.
</Document>

                              
                            

ID and IDREF
This shows how ID and IDREF attributes can be used as a Flyweight. Note thats this would require some extra work on the part of the processing software to do the substitution.
                              

<Document>
<text id="title">My Document</text>
<title IDREF="title"/>
<h1 IDREF="title"/>
</Document>

                              
                            



Discussion:

This pattern can greatly enhance the maintainability of a document, if the same data is repeated several times, and that data changes, every occurrence of that data must be found and updated. This can be a tedious and error prone task. Having the data in only one place allows all occurrences of it to be changed at once.

The Flyweight pattern should not be used if the shared information can vary over time. This would increase the maintenance burden of the document.

Readability of the document can suffer if the Flyweight pattern is used, readers are forced to reference a different section of the document when looking at the contents.



Related Patterns:

See Declare Before First Use for suggestions on where to place the shared information.


Known Uses:

XHTML uses a a common attributes parameter entity that is a Flyweight.

The XML & SGML Cookbook page 1-126 mentions the Flyweight pattern.



Visit our sponsors: (Interested in advertising on XMLPatterns.com?)