JAVA设计模式之享元模式

来源:互联网 发布:js修改button的文字 编辑:程序博客网 时间:2024/06/02 05:10

场景:内存属于稀缺资源,不要随便浪费,如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存

核心:享元模式以共享的方式高效地支持大量细粒度对象的重用

  • 享元模式对象能做到共享的关键是区分了内部状态和外部状态。

内部状态:可以共享,不会碎环境变化而变化
外部状态:不可以共享,会随环境变化而改变

package com.imust.flyweight;/** * 享元类 * @author  Zachary (为上帝所心仪的人) * @date    2017年9月7日 * @project shejimoshi * @package com.imust.flyweight */public interface ChessFlyWeight {    void setColor(String s);    String getColor();    void display(Coordinate c);}/** * 具体的享元类 为内部状态提供成员变量进行存储 * @author  Zachary (为上帝所心仪的人) * @date    2017年9月7日 * @project shejimoshi * @package com.imust.flyweight */class ConcreateChess implements ChessFlyWeight{    private String color;    public ConcreateChess(String color) {        super();        this.color = color;    }    @Override    public void setColor(String c) {        this.color = c;    }    @Override    public String getColor() {        return color;    }    @Override    public void display(Coordinate c) {        System.out.println("棋子颜色"+color);        System.out.println("棋子位置"+c.getX()+c.getY());    }}
package com.imust.flyweight;/** * 外部状态 UnSharedConcreateFlyWeight * @author  Zachary (为上帝所心仪的人) * @date    2017年9月7日 * @project shejimoshi * @package com.imust.flyweight */public class Coordinate {    private int x;    private int y;    public Coordinate(int x, int y) {        super();        this.x = x;        this.y = y;    }    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public int getY() {        return y;    }    public void setY(int y) {        this.y = y;    }}
package com.imust.flyweight;/** * 外部状态 UnSharedConcreateFlyWeight * @author  Zachary (为上帝所心仪的人) * @date    2017年9月7日 * @project shejimoshi * @package com.imust.flyweight */public class Coordinate {    private int x;    private int y;    public Coordinate(int x, int y) {        super();        this.x = x;        this.y = y;    }    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public int getY() {        return y;    }    public void setY(int y) {        this.y = y;    }}
package com.imust.flyweight;public class Client {    public static void main(String[] args) {        ChessFlyWeight chess1 = new ChessFlyWeightFactory().getChess("黑色");        ChessFlyWeight chess2 = new ChessFlyWeightFactory().getChess("黑色");        System.out.println(chess1);        System.out.println(chess2);        System.out.println("增加外部状态的处理");        chess1.display(new Coordinate(10, 10));        chess2.display(new Coordinate(20, 20));    }}