e2

滴滴侠,fai抖

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

享元接口:

package fly_weight_mode;

/**
 * 享元接口
 */
public interface ChessFlyWeight {
    
    /**
     * 获得颜色
     */
    String getColor();
    
    /**
     * 显示位置
     */
    void display(Coordinate c);
    
}

 

具体享元类:

package fly_weight_mode;

/**
 * 具体享元类(不可变类)
 */
public class ConcreteChess implements ChessFlyWeight{

    
    /**
     * 颜色是共享(不变)的
     * 该字段是: 为内部状态提供成员变量给予存储
     * 享元模式中称此成员为: 内部状态ConcreteFlyWeight
     */
    private String color;
    
    
    /**
     * 构造器(传入颜色)
     */
    public ConcreteChess(String color){
        this.color = color;
    }

    
    /**
     * 获得颜色
     */
    @Override
    public String getColor() {
        return color;
    }

    
    /**
     * 显示位置(传入坐标)
     */
    @Override
    public void display(Coordinate c) {
        System.out.println("棋子颜色: " + color);
        System.out.println("棋子位置: " + c.getX() + "-----" + c.getY());
    }
    
}

 

坐标类:

package fly_weight_mode;

/**
 * 坐标类(在享元对象中, 此对象是可更换的)
 * 享元模式中称此类为: 外部状态UnSharedConcreteFlyWeight
 */
public class Coordinate {

    private int x, y;

    public Coordinate(int x, int y) {
        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 fly_weight_mode;

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

/**
 * 享元工厂类
 */
public class ChessFlyWeightFactory {

    
    /**
     * 享元对象池(容器)
     */
    private static Map<String, ChessFlyWeight> map = new HashMap<String, ChessFlyWeight>();
    
    
    /**
     * 控制享元对象创建
     * 此模式的核心: 有就取, 没有就创建, 达到复用, 节省内存空间(以时间换取空间)
     */
    public static ChessFlyWeight getChess(String color){
        if (map.get(color)!=null) {
            return map.get(color);
        }else {
            ChessFlyWeight cfw = new ConcreteChess(color);
            map.put(color, cfw);
            return cfw;
        }
    }
    
}

 

测试类:

package fly_weight_mode;

public class Client {

    public static void main(String[] args) {
        ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色");//第一次, 享元池(容器)中, 没有则创建
        ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess("黑色");//第二次已有, 直接取出来, 不创建对象
        System.out.println(chess1);
        System.out.println(chess2);//同一个对象, 当做1号黑子吧!
        
        
        System.out.println("增加外部状态的处理------------------------");
        chess1.display(new Coordinate(10, 10));
        chess2.display(new Coordinate(20, 20));//1号黑子, 只有显示的位置发生了变化
        
        
        //此demo是模拟, 真实是以编号不同则创建对象的
    }
    
}

 

执行结果:

fly_weight_model.ConcreteChess@1db9742
fly_weight_model.ConcreteChess@1db9742
增加外部状态的处理------------------------
棋子颜色: 黑色
棋子位置: 10-----10
棋子颜色: 黑色
棋子位置: 20-----20

 

 

谢谢声明出处!

转自: http://www.cnblogs.com/gscq073240/articles/7110961.html

 

posted on 2017-07-03 14:25  纯黑Se丶  阅读(123)  评论(0编辑  收藏  举报