Problem: Designing objects down to the
lowest levels of system "granularity" provides optimal flexibility, but can be
unacceptably expensive in terms of performance and memory usage.
Purpose of Flyweight Pattern
- Reduce storage costs for a large number of objects.
- Share objects to be used in multiple contexts simultaneously.
- Retain object oriented granularity and flexibility
What is the Flyweight Pattern
A flyweight is an object that minimizes memory by sharing data as much as
possible with other similar objects.
The Flyweight pattern describes how to share objects to allow their use at fine
granularities without prohibitive cost.
Each "flyweight" object is divided into two pieces: the state-dependent
(extrinsic) part, and the state-independent (intrinsic) part. Intrinsic state is
stored (shared) in the Flyweight object. Extrinsic state is stored or computed
by client objects, and passed to the Flyweight when its operations are invoked.
Flyweight is appropriate for small, fine-grained classes like individual
characters or icons on the screen.
Example:
Each character in a word document is represented as a single instance of a
character class, but the positions where the characters are drawn on the screen
are kept as external data. In this case, there only has to be one instance of
each character, rather than one for each appearance of that character.
Flyweight uses in C#
If there are two instances of a String constant with identical characters, they
could refer to the same storage location.
Implementing the Pattern
A school wants to print its student info (Student Name, Roll Number, School
Name, School Address, Pin, and Country) where student name and roll numbers are
different and all other things are the same for each student
Flyweight Pattern.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleDesignPattern
{
class Students //Flyweight Class
{
public string schoolName = "Delhi Public School";
public string schoolAddress
= "Mathura Road, Delhi";
public string strPin = "01";
public string strCountry =
"India";
void PrintStudentInfo(string
studentName, string rollNumber)
{
Console.WriteLine(studentName + rollNumber + schoolName + schoolAddress + strPin
+ strCountry);
Console.ReadLine();
}
}
}
Program.cs
class MainApp
{
public static void Main()
{
//
Implementing Flyweight Pattern (only one object is created for all students
which will reduce memory usage)
Students flyWeightClient =
new Students();
flyWeightClient.PrintStudentInfo("Nitin
Mittal", "153551");
flyWeightClient.PrintStudentInfo("Tom",
"153550");
}
}