享元模式Flyweight

1.意图:运用共享技术有效地支持大量细粒度的对象。
2.结构
在这里插入图片描述

描述一个接口,通过这个接口Flyweight可以接受并作用于外部状态;
ConcreteFlyweight实现Flyweight接口,并为内部状态(如果有)增加存储空间。ConreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的,即它必须独立于ConcreteFlyweight对象的场景;
并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子结点;
FlyweightFactory创建并管理Flyweight对象;确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者在不存在时创建一个实例;
Client维持一个对Flyweight的引用,计算或存储一个或多个Flyweight的外部状态。
3.适用性:
一个应用程序使用了大量的对象;
完全由于使用大量的对象,造成了很大的存储开销;
对象的大多数状态都可变为外部状态;
如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象;
应用程序不依赖于对象标识。由于Flyweight对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。
代码案例
享元模式主要用于减少创建对象的数量,以低内存占用,提高性能。开发一个网络围棋程序允许多个玩家联机下棋。由于只有一台服务器,为节省内存空间,采用享元模式实现该程序。

import java.util.ArrayList;
/**
 * 享元模式
 */
public class FlyWeight {
    public static void main(String[] args) {
        PieceBoard board = new PieceBoard("张三","李四");
        PiecePos pos1 = new PiecePos(4,6);
        board.setPiect(PieceColor.BLACK,pos1);
        PiecePos pos2 = new PiecePos(2,6);
        board.setPiect(PieceColor.WHITE,pos2);
    }
}
enum PieceColor{BLACK,WHITE}//棋子颜色
class PiecePos{//棋子位置
    private int x;
    private int y;
    public PiecePos(int a ,int b){
        x = a;
        y = b;
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
}
abstract class Piece{//棋子定义
    protected PieceColor m_color;//颜色
    protected PiecePos m_pos;//位置
    public Piece(PieceColor color,PiecePos pos){
        m_color = color;
        m_pos = pos;
    }
    public abstract void draw();
}
class BlackPiece extends Piece{
    public BlackPiece(PieceColor color, PiecePos pos) {
        super(color, pos);
    }
    @Override
    public void draw() {
        System.out.println("draw a blackPiece");
    }
}
class WhitePiect extends Piece{
    public WhitePiect(PieceColor color, PiecePos pos) {
        super(color, pos);
    }
    @Override
    public void draw() {
        System.out.println("draw a whitePiece");
    }
}
class PieceBoard{//棋盘上已有的棋子
    private static final ArrayList<Piece> m_arrayPiece = new ArrayList<>();
    private String m_blackName;//黑方名称
    private String m_whiteName;//白方名称
    public PieceBoard (String black,String white){
        m_blackName = black;
        m_whiteName = white;
    }
    //一步棋,在棋盘上放一个棋子
    public void setPiect(PieceColor color, PiecePos pos){
        Piece piece = null;
        if(color == PieceColor.BLACK){//放黑子
            piece = new BlackPiece(color,pos);//获取一颗黑子
            System.out.println(m_blackName+"放在位置("+pos.getX()+","+pos.getY()+")");
            piece.draw();
        }else{//放白子
            piece = new BlackPiece(color,pos);//获取一颗白子
            System.out.println(m_whiteName+"放在位置("+pos.getX()+","+pos.getY()+")");
            piece.draw();
        }
        m_arrayPiece.add(piece);
    }
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值