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");
}
}