• 设计模式学习(十一) 享元模式


    场景:

      -- 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的对象,我们可以通过享元模式,节省内存。

    核心:

       -- 享元模式以共享的方式高效地支持大量细粒度对象的重用。

      -- 享元对象能做到共享的关键是区分了内部状态和外部状态。

    • 内部状态:可以共享,不会随环境变化而改变
    • 外部状态:不可以共享,会随环境变化而改变

    享元模式实现:

      -- FlyweightFactory享元工厂类

          创建并管理享元对象,享元池一般设计成键值对

      -- FlyWeight抽象享元类

         通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态

      -- ConcreteFlyWeight具体享元类

         为内部状态提供成员变量进行存储

      -- UnsharedConcreteFlyWeight

         不能被共享的子类可以设计为非共享享元类

    代码实现:

    package com.lp.flyweight;
    //享元类
    public interface ChessFlyWeight {
        void setColor(String c);
        String getColer();
        void display( Coordinate c);
        
    }
    
    //具体享元类
    class ConcreteChess implements ChessFlyWeight{
        
        private String color;
    
        @Override
        public void setColor(String c) {
            this.color = c;
            
            
        }
    
        public ConcreteChess(String color) {
            super();
            this.color = color;
        }
    
        @Override
        public String getColer() {
            return color;
        }
    
        @Override
        public void display(Coordinate c) {
            System.out.println("棋子颜色:" + color);
            System.out.println("棋子位置:" + c.getX()+"---" +c.getY());
            
        }
        
    
    }
    具体享元类
    package com.lp.flyweight;
    
    //外部状态
    public class Coordinate {
        private int x,y;
    
        public Coordinate(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;
        }
        
    }
    不被共享的
    package com.lp.flyweight;
    
    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 com.lp.flyweight;
    
    public class Client {
        public static void main(String[] args){
            ChessFlyWeight chess1 = ChessFlyWeightFactory.getChess("黑色");
            ChessFlyWeight chess2 = ChessFlyWeightFactory.getChess("白色");
            ChessFlyWeight chess3 = ChessFlyWeightFactory.getChess("黑色");
            chess1.setColor("红");
            
            
            chess1.display(new Coordinate(10, 20));
            System.out.println(chess1);
            chess2.display(new Coordinate(11, 20));
            System.out.println(chess2);
            System.out.println(chess3.getColer());
        }
    }
    客户端

    优点:

      -- 极大减少内存中对象的数量

      -- 相同或相似对象内存中之存一份,极大的节约资源,提高系统性能

      -- 外部状态相对独立,不影响内部状态

    缺点:

      -- 模式较复杂,是程序逻辑复杂化

      -- 为了节省内存,共享了内部状态,分离出外部状态,而读取外部状态使运行时间变长,用时间换取了空间

  • 相关阅读:
    典型并发任务
    第九章使用共享变量实现并发
    第八章goroutine和通道
    第七章接口
    第六章方法
    第一章
    第四章复合数据类型
    第三章基础数据类型
    Django其他
    VUE学习日记(五) ---- 组件定义 component
  • 原文地址:https://www.cnblogs.com/lipeng0824/p/4439913.html
Copyright © 2020-2023  润新知