java设计模式 GOF23 11 享元模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式 GOF23 11 享元模式相关的知识,希望对你有一定的参考价值。

一.享元模式简介

  如果有很多相同或者相似的对象可以使用享元模式,从而节约内存。

二.关键点

  享元对象需要区分内部状态和外部状态。

  内部状态:可以共享,不会随着外部状态改变。

  外部状态:不可以共享,随外部状态改变。

  享元共享类实现享元池管理享元对象。

三.简单实现

package com.lz.flyWeight;

/*
 * 享元模式
* 内部状态 * 模拟棋盘,因为一盘棋其中棋子的颜色都一样 * 只有位置不一样,所以可以将颜色共享,这样可以节省内存空间 * 棋盘接口
*/ interface Chess { void setColor(String c); String getColor(); void display(ChessLoc chess); } class ChessFlyWeight implements Chess { private String c; @Override public void setColor(String c) { this.c = c; } @Override public String getColor() { return this.c; } public ChessFlyWeight(String c) { super(); this.c = c; } @Override public void display(ChessLoc chess) { System.out.print("颜色:"+c+" "); System.out.print("坐标("+chess.getX()); System.out.println(","+chess.getY()+")"); } }


package com.lz.flyWeight;

import java.util.HashMap;
import java.util.Map;

/*
 * 享元工厂类
 */
public class FlyWeightFactory {
    /*
     * 享元池对象
     */
    private static Map<String, Chess> map = new HashMap<String, Chess>();
    
    public static Chess getChess(String c) {
        if ( map.get(c) != null) {
            return map.get(c);
        } else {
            ChessFlyWeight chess = new ChessFlyWeight(c);
            map.put(c, chess);
            return chess;
        }
    }
}
package com.lz.flyWeight;

/*
 * 测试类
 */
public class Client {
    public static void main(String[] args) {
        Chess tmp1 = FlyWeightFactory.getChess("黑");
        Chess tmp2 = FlyWeightFactory.getChess("红色");
        System.out.println(tmp1);
        System.out.println(tmp2);
        tmp1.display(new ChessLoc(1, 2));
        tmp2.display(new ChessLoc(5, 4));
    }
}
package com.lz.flyWeight;

/**
 * 位置信息
 * 外部状态,不可共享
 */
public class ChessLoc {
    private int x;
    private int y;
    public ChessLoc(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;
    }
}

四.总结

  享元模式就是把对象相同相似的属性封装,不同的,变化的属性从外部传入,从而降低内存开销

以上是关于java设计模式 GOF23 11 享元模式的主要内容,如果未能解决你的问题,请参考以下文章

GoF 23 种设计模式之享元模式和组合模式

GOF 23种设计模式

GOF23汇总

一起来学GOF23种设计模式

JAVA SCRIPT设计模式--结构型--设计模式之FlyWeight享元模式(11)

设计模式GOF23大纲