Coding With Fun
Home Docker Django Node.js Articles Python pip guide FAQ Policy

Hedony mode


May 27, 2021 Design mode


Table of contents


Hedony mode

Flyweight Pattern is primarily used to reduce the number of objects created to reduce memory footprint and improve performance. This type of design pattern is structural and provides ways to reduce the number of objects to improve the structure of objects required for your application.

Healing mode attempts to reuse an existing similar object and creates a new object if a matching object is not found. W e'll demonstrate this pattern by creating 5 objects to draw 20 circles distributed in different locations. Because there are only 5 colors available, the color property is used to examine existing Circle objects.

Introduced

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

Key solution: When there are a large number of objects, there is a risk of memory overflow, and we abstract out the common parts of them, and if there is the same business request, return the objects that already exist in memory directly to avoid recreating them.

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 states of these objects can be externalized. 4 , these objects can be divided into many groups according to the inner state, when the external objects are excluded from the object, each group of objects can be replaced with an object. 5 , the system does not depend on the identity of these objects, these objects are indesuishable.

How to resolve: Use a unique identifier to determine that, if in memory, returns the object identified by the unique identifier.

Key code: Store these objects with HashMap.

Application instance: String in 1, JAVA, if returned, and if not, a string is created to be saved in the string cache pool. 2 , the database's data pool.

Pros: Greatly reduce object creation, reduce system memory, and increase efficiency.

Cons: Increased system responsibility, the need to separate the external state from the internal state, and the external state is inherent in nature, should not change with the internal state, otherwise it will cause confusion of the system.

Use scenario: 1, the system has a large number of similar objects. 2 , the need to buffer the pool scene.

Note: 1, pay attention to dividing the external state and the internal state, otherwise it may cause thread security problems. 2 , these classes must have a factory object to control.

Realize

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

ShapeFactory has a HashMap for Circle, where the key is the color of the Circle object. W henever a request is received, a circle of a specific color is created. ShapeFactory checks its Circle object in HashMap and, if it is found, returns the object, otherwise a new object stored in hashmap is created for subsequent use and returns the object to the client.

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

Hedony mode

Step 1

Create an interface.

Shape.java

public interface Shape {
   void draw();
}

Step 2

Create an entity class that implements the interface.

Circle.java

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 for entity classes based on given information.

ShapeFactory.java

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

Using this factory, you get the objects of the entity class by passing color information.

FlyweightPatternDemo.java

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

Verify the output.

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