美文网首页
第4章 结构型模式-享元模式

第4章 结构型模式-享元模式

作者: 一介书生独醉江湖 | 来源:发表于2022-06-22 19:01 被阅读0次
    结构型模式的目的是通过组合类或对象产生更大结构,以适应更高层次的逻辑需求;
    
    结构型模式共有7种:
    ■ 代理模式
    ■ 装饰模式
    ■ 适配器模式
    ■ 组合模式
    ■ 桥梁模式
    ■ 外观模式
    ■ 享元模式
    
    一、享元模式的简介
    ■ 享元模式(Flyweight Pattern)是池技术的重要实现方式,可以降低大量重复的、细粒度的类在内存中的开销;
    ■ 使用共享对象可有效地支持大量的细粒度的对象;
    ■ Java基础类库中大量使用了享元模式,如String、Integer、Boolean、Character等类都通过享元模式提供了内部的池化机制;
    
    image.png
    享元模式4个角色:
    ■ 抽象享元(Flyweight)角色:
      该角色对享元类进行抽象,需要外部状态的操作可以通过参数的形式将外部状态传入;
    ■ 具体享元(ConcreteFlyweight)角色:
      该角色实现抽象享元定义的业务;
      注意享元对象的内部状态必须与环境无关;
    ■ 享元工厂(FlyweightFactory)角色:
      该角色就是构造一个池容器,负责创建和管理享元角色;
    ■ 客户端(Client)角色:
      该角色需要自行存储所有享元对象的外部状态;
    
    二、享元模式的优缺点
    ■ 享元模式的优点:
      大幅减少内存中对象的数量,降低程序内存的占用,提高性能;
    ■ 享元模式的缺点:
      享元模式增加了系统的复杂性;
      享元模式将享元对象的状态外部化,而读取外部状态使得运行时间变长;
    
    三、享元模式的实例
    # 模拟下围棋的过程;
    
    image.png
    /**
     * 棋子接口
     */
    public interface Chesspiece {
        /**
         * 落子
         * @param x 棋子的坐标x
         * @param y 棋子的坐标y
         */
        void put(int x , int y);
    }
    
    
    /**
     * 棋子具体享元
     */
    public class ChesspieceFlyweight implements Chesspiece{
    
        /**
         * 棋子颜色:黑、白
         */
        private String color;
    
        public ChesspieceFlyweight(String color) {
            this.color = color;
        }
    
        @Override
        public void put(int x, int y) {
            System.out.println("落子坐标 (" + x + " , " + y + ")");
        }
    }
    
    /**
     * 棋子享元工厂
     */
    public class ChesspieceFactory {
    
        /**
         * 白子享元
         */
        static final ChesspieceFlyweight WHITE = new ChesspieceFlyweight("白");
    
        /**
         * 黑子享元
         */
        static final ChesspieceFlyweight BLACK = new ChesspieceFlyweight("黑");
    
        /**
         * 根据颜色获取棋子享元
         * @param color
         * @return
         */
        public static Chesspiece getChesspiece(String color){
            if(color.equals("白")){
                return WHITE;
            }else{
                return BLACK;
            }
        }
    }
    
    /**
     * 测试类Game
     */
    public class Game {
        public static void main(String[] args){
            Chesspiece c1 = ChesspieceFactory.getChesspiece("黑");
            c1.put(1,1);
            Chesspiece c2 = ChesspieceFactory.getChesspiece("白");
            c2.put(1,2);
            Chesspiece c3 = ChesspieceFactory.getChesspiece("黑");
            c3.put(2,1);
            Chesspiece c4 = ChesspieceFactory.getChesspiece("白");
            c4.put(2,2);
            Chesspiece c5 = ChesspieceFactory.getChesspiece("黑");
            c5.put(3,1);
            Chesspiece c6 = ChesspieceFactory.getChesspiece("白");
            c6.put(3,2);
        }
    }
    
    # 控制台输出 : 
    落子坐标 (1 , 1)
    落子坐标 (1 , 2)
    落子坐标 (2 , 1)
    落子坐标 (2 , 2)
    落子坐标 (3 , 1)
    落子坐标 (3 , 2)
    
    参考:
    摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
    

    相关文章

      网友评论

          本文标题:第4章 结构型模式-享元模式

          本文链接:https://www.haomeiwen.com/subject/mvjmvrtx.html