美文网首页
享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)

作者: 群众里面有坏人呐 | 来源:发表于2018-12-30 13:07 被阅读0次

    定义

    享元模式(Flyweight Pattern),又称轻量级模式(这也是其英文名为FlyWeight的原因),通过共享技术有效地实现了大量细粒度对象的复用。
    内部状态:在享元对象内部不随外界环境改变而改变的共享部分。
    外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。

    角色

    • FlyWeight 享元接口或者(抽象享元类),定义共享接口
    • ConcreteFlyWeight 具体享元类,该类实例将实现共享
    • UnSharedConcreteFlyWeight 非共享享元实现类
    • FlyWeightFactory 享元工厂类,控制实例的创建和共享

    实例

    享元接口

    public interface Shape {
        void draw();
    }
    

    具体享元类

    public class Circle implements Shape {
        String color;
    
        public Circle(String color) {
            this.color = color;
        }
    
        @Override
        public void draw() {
            System.out.println("draw a circle, and the color is "+color);
        }
    }
    

    享元工厂类

    public class ShapeFactory {
        public int SUM=0;
        public int SUM_OBJECT=0;
        public static ConcurrentHashMap<String, Shape> map = new ConcurrentHashMap<String, Shape>();
        public Shape getShape(String color){
            if (map.get(color) == null) {
                synchronized (map) {
                    if (map.get(color) == null) {
                        map.put(color, new Circle(color));
                        SUM_OBJECT++;
                    }
                }
            }
            SUM++;
            return map.get(color);
        }
    }
    

    测试代码

    public class Test {
        public static void main(String[] args) {
            ShapeFactory factory = new ShapeFactory();
            factory.getShape("red").draw();
            factory.getShape("black").draw();
            factory.getShape("blue").draw();
            factory.getShape("green").draw();
            factory.getShape("red").draw();
            factory.getShape("blue").draw();
            factory.getShape("red").draw();
    
            System.out.println("共画了"+factory.SUM+"个圆");
            System.out.println("共产生了"+factory.SUM_OBJECT+"个对象");
        }
    }
    

    运行结果

    draw a circle, and the color is red
    draw a circle, and the color is black
    draw a circle, and the color is blue
    draw a circle, and the color is green
    draw a circle, and the color is red
    draw a circle, and the color is blue
    draw a circle, and the color is red
    共画了7个圆
    共产生了4个对象
    

    相关文章

      网友评论

          本文标题:享元模式(Flyweight Pattern)

          本文链接:https://www.haomeiwen.com/subject/oxlvlqtx.html