Java设计模式(十)--享元模式

60 阅读1分钟

简介

享元模式用于减少对象创建的数量,以及减少内存的占用并提高系统的性能,尝试复用现有的对象。

抽象享元类

 public interface Shape {
    void draw();
 }

具体享元类

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

享元工厂类

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

测试

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

从代码中能看出将需要重复使用的对象存放在缓存中,需要使用对象的时候只需要从缓存中获取,而不需要重新创建,减少了内存使用空间。

总结

享元模式减少了对象的创建,像线程池这些都属于享元模式,在外观模式下是将方法抽成一个公共的方法,而享元模式则是将对象抽成一个公共的对象。