Big Talk Design Pattern - Flyweight

Flyweight

Intent

Use sharing to support a large number of fine-grained objects, some of which have the same internal state.

Class Diagram

  • Flyweight: Flyweight object
  • IntrinsicState: internal state, flyweight objects share internal state
  • ExtrinsicState: External state, the external state of each flyweight object is different

Implementation

public interface Flyweight {
    
    
    void doOperation(String extrinsicState);
}
public class ConcreteFlyweight implements Flyweight {
    
    

    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
    
    
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void doOperation(String extrinsicState) {
    
    
        System.out.println("Object address: " + System.identityHashCode(this));
        System.out.println("IntrinsicState: " + intrinsicState);
        System.out.println("ExtrinsicState: " + extrinsicState);
    }
}
public class FlyweightFactory {
    
    

    private HashMap<String, Flyweight> flyweights = new HashMap<>();

    Flyweight getFlyweight(String intrinsicState) {
    
    
        if (!flyweights.containsKey(intrinsicState)) {
    
    
            Flyweight flyweight = new ConcreteFlyweight(intrinsicState);
            flyweights.put(intrinsicState, flyweight);
        }
        return flyweights.get(intrinsicState);
    }
}
public class Client {
    
    

    public static void main(String[] args) {
    
    
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight flyweight1 = factory.getFlyweight("aa");
        Flyweight flyweight2 = factory.getFlyweight("aa");
        flyweight1.doOperation("x");
        flyweight2.doOperation("y");
    }
}
Object address: 1163157884
IntrinsicState: aa
ExtrinsicState: x
Object address: 1163157884
IntrinsicState: aa
ExtrinsicState: y

JDK

Java uses caching to speed up access times for large numbers of small objects.

  • java.lang.Integer#valueOf(int)
  • java.lang.Boolean#valueOf(boolean)
  • java.lang.Byte#valueOf(byte)
  • java.lang.Character#valueOf(char)

Guess you like

Origin blog.csdn.net/weixin_42917352/article/details/131227656