享元模式

1.享元模式

享元模式(Flyweight Pattern)主要用于减少对象的数量,以减少内存占用和提高性能。属于结构型模式,它提供了减少对象数量从而改
善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

特别像工厂模式,工厂模式中是new一个对象返回的,享元模式是共享一个对象。

实现细节:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象。若没有就创建一个对象并将其放入缓存池(HashMap)中。

2.例子Demo

import java.util.HashMap;

interface Shape {
    public void draw();
}


class Circle implements Shape {
    private int x;
    private int y;
    private int r;
    private String color;

    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 setR(int r) {
        this.r = r;
    }

    public void draw() {
        System.out.println("Circle: [ color: " + color + " X: " + x + " Y: " + y + " R: " + r + " ]");
    }
}


class ShapeFactory {
    private HashMap<String, Shape> map = new HashMap<String, Shape>();

    public Shape getCircle(String color) {
        Shape circle = map.get(color);
        if (circle == null) {
            System.out.println("Create new circle, Color: " + color);
            circle = new Circle(color);
            map.put(color, circle);
        }
        return circle;
    } 
}


public class FlyweightPatternDemo {
    private static final String colors[] = {
        "green", "red", "blue", "dark", "gray", "yellow"
    };

    public static void main(String args[]) {
        ShapeFactory shapeFactory = new ShapeFactory();

        for (int i = 0; i < 20; i++) {
            /*强制转换为Circle里后这些方法才可见*/
            Circle circle = (Circle)shapeFactory.getCircle(getRandomColor());
            circle.setX(getRandomX());
            circle.setY(getRandomY());
            circle.setR(getRandomR());
            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);
    }

    private static int getRandomR() {
        return (int)(Math.random() * 100);
    }
}

参考:http://www.runoob.com/design-pattern/flyweight-pattern.html

原文地址:https://www.cnblogs.com/hellokitty2/p/10717932.html