Picture mode

Flyweight Pattern is mainly used to reduce the number of objects created to reduce memory usage and improve performance. This type of design pattern is a structured pattern that provides a way to reduce the number of objects and improve the structure of the objects needed for the application.

The Flyweight mode attempts to reuse an existing homogeneous object, and if no matching object is found, a new object is created. We will demonstrate this pattern by creating 5 objects to draw 20 circles distributed in different locations. Since there are only 5 available colors, the color attribute is used to check for existing Circle objects.


Intent: Use sharing techniques to effectively support a large number of fine-grained objects.

Main solution: When there are a large number of objects, it may cause memory overflow. We abstract the common parts. If there is the same business request, it will directly return the existing memory. Object, avoid re-creating.

When to use: 1. There are a large number of objects in the system. 2. These objects consume a lot of memory. 3. Most of the state of these objects can be externalized. 4. These objects can be divided into many groups according to the intrinsic state. When the exogenous objects are removed from the object, each group of objects can be replaced by an object. 5. The system does not depend on the identity of these objects, these objects are indistinguishable.

How to solve: Use the unique identification code to determine, if there is in memory, return the object identified by this unique identifier.

Key Code: Store these objects with HashMap.

Application example: 1, the String in JAVA, if it returns, if not, create a string stored in the string cache pool. 2, the data pool of the database.

Advantages: greatly reduces object creation, reduces system memory, and improves efficiency.

Disadvantages: Increases the complexity of the system. It needs to separate the external state and the internal state. The external state has inherent properties and should not change with the internal state. Otherwise, Causes system confusion.

Usage scenarios: 1. The system has a large number of similar objects. 2. The scene of the buffer pool is required.

Note: 1, pay attention to the division of the external state and internal state, otherwise it may cause thread safety problems. 2. These classes must have a factory object to control.


We will create an Shape interface and an entity class Circle that implements the Shape interface. The next step is to define the factory class ShapeFactory.

ShapeFactory has an Circle HashMap where the key name is the color of the Circle object. A circle of a specific color is created whenever a request is received. ShapeFactory checks the circle object in its HashMap, returns the object if an Circle object is found, otherwise it creates a store in the hashmap Prepare a new object for subsequent use and return the object to the client.

FlyWeightPatternDemo, our demo class uses ShapeFactory to get the Shape object. It will pass information to ShapeFactory (red / green / blue/ black / white) to get the color of the object it needs.


Step 1

Create an interface.


public interface Shape { void draw(); }

Step 2

Create an entity class that implements the interface.


public class Circle implements Shape { private String color; private int x; private int y; private int radius; public Circle(String color){ this.color = color; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public void setRadius(int radius) { this.radius = radius; } @Override public void draw() { System.out.println("Circle: Draw() [Color : " + color +", x : " + x +", y :" + y +", radius :" + radius); } }

Step 3

Create a factory that generates objects based on the entity class for the given information.


import java.util.HashMap; public class ShapeFactory { private static final HashMap<String, Shape> circleMap = new HashMap<>(); public static Shape getCircle(String color) { Circle circle = (Circle)circleMap.get(color); if(circle == null) { circle = new Circle(color); circleMap.put(color, circle); System.out.println("Creating circle of color : " + color); } return circle; } }

Step 4

Use this factory to get the object of the entity class by passing the color information.


public class FlyweightPatternDemo { private static final String colors[] = { "Red", "Green", "Blue", "White", "Black" }; public static void main(String[] args) { for(int i=0; i < 20; ++i) { Circle circle = (Circle)ShapeFactory.getCircle(getRandomColor()); circle.setX(getRandomX()); circle.setY(getRandomY()); circle.setRadius(100); circle.draw(); } } private static String getRandomColor() { return colors[(int)(Math.random()*colors.length)]; } private static int getRandomX() { return (int)(Math.random()*100 ); } private static int getRandomY() { return (int)(Math.random()*100); } }

Step 5

Executing the program, outputting results:

Creating circle of color : Black
Circle: Draw() [Color : Black, x : 36, y :71, radius :100
Creating circle of color : Green
Circle: Draw() [Color : Green, x : 27, y :27, radius :100
Creating circle of color : White
Circle: Draw() [Color : White, x : 64, y :10, radius :100
Creating circle of color : Red
Circle: Draw() [Color : Red, x : 15, y :44, radius :100
Circle: Draw() [Color : Green, x : 19, y :10, radius :100
Circle: Draw() [Color : Green, x : 94, y :32, radius :100
Circle: Draw() [Color : White, x : 69, y :98, radius :100
Creating circle of color : Blue
Circle: Draw() [Color : Blue, x : 13, y :4, radius :100
Circle: Draw() [Color : Green, x : 21, y :21, radius :100
Circle: Draw() [Color : Blue, x : 55, y :86, radius :100
Circle: Draw() [Color : White, x : 90, y :70, radius :100
Circle: Draw() [Color : Green, x : 78, y :3, radius :100
Circle: Draw() [Color : Green, x : 64, y :89, radius :100
Circle: Draw() [Color : Blue, x : 3, y :91, radius :100
Circle: Draw() [Color : Blue, x : 62, y :82, radius :100
Circle: Draw() [Color : Green, x : 97, y :61, radius :100
Circle: Draw() [Color : Green, x : 86, y :12, radius :100
Circle: Draw() [Color : Green, x : 38, y :93, radius :100
Circle: Draw() [Color : Red, x : 76, y :82, radius :100
Circle: Draw() [Color : Blue, x : 95, y :82, radius :100

javacodegeeks is optimized for learning.© javacodegeeks .
All Right Reserved and you agree to have read and accepted our term and condition