码迷,mamicode.com
首页 > 编程语言 > 详细

java设计模式 GOF23 11 享元模式

时间:2016-04-07 01:09:33      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

一.享元模式简介

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

二.关键点

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

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

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

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

三.简单实现

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 享元模式

标签:

原文地址:http://www.cnblogs.com/larobyo/p/5361598.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!