• 享元模式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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

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

  • 相关阅读:
    jQuery基础知识
    基于C语言实现的PA4实验报告
    通达信指标接口的代码测试
    如何在vue中使用百度地图添加自定义覆盖物(水波纹)动画效果
    如何在Linux服务器上部署Vue项目
    【iOS】——知乎日报第三周总结
    Vue项目之使用EditorConfig, Eslint和Prettier实现代码规范
    jmeter 压测脚本JMX
    小白从CentOS7到安装CDH6.3.2入坑实操指北(二)
    HDU 2648:Shopping ← STL map
  • 原文地址:https://blog.csdn.net/qq_39548700/article/details/128142816