zoukankan      html  css  js  c++  java
  • java设计模式--享元模式

    享元模式(flyweight)

    当需要有很多完全相同或相似的对象需要创建的时候,主要是相似的时候,我们可以用享元模式。尽可能少创建对象,节省内存。

    享元模式主要有4中角色

    1.享元的工厂

    2.抽象享元对象

    2.内部状态对象:可以共享的

    3.外部状态对象:不可以共享的

    下面以围棋的棋子为例:每个棋子都是一个对象,但是每个棋子的大部分都一样,只有颜色,摆放位置不一样,这样就没必要每个棋子都创建一个对象,把相同的和不同的分离开来。

    //享元类抽象
    public interface FlyWeight {
        
        void setColor(String color);
        
        String getColor();
        
        void diplay(Waibu c);
        
    
    }
    
    //内部,可以共享的分离出来,引用外部不可以共享的
    class Neibu implements FlyWeight{
        
        private String color;
        
        public Neibu(String color) {
            this.color = color;
        }
    
        public void setColor(String color) {
            this.color = color;
            
        }
    
        public String getColor() {
            return color;
        }
    
        public void diplay(Waibu c) {
            System.out.println("棋子颜色"+color);
            System.out.println("棋子为止"+c.getX()+":"+c.getY());
            
        }
        
    }
    
    //外部,不可以共享的分离出来
    class Waibu{
        
        private String x;
    
        private String y;
        
        public Waibu(String x, String y) {
            this.x = x;
            this.y = y;
        }
    
        public String getX() {
            return x;
        }
    
        public void setX(String x) {
            this.x = x;
        }
    
        public String getY() {
            return y;
        }
    
        public void setY(String y) {
            this.y = y;
        }
    //享元工厂
    public class FlyWeightFactory {
        
        private static Map<String, FlyWeight> map = new HashMap<String, FlyWeight>();
        
        public static FlyWeight get(String color){
            if(map.get(color)!=null){
                return map.get(color);
            }else{
                FlyWeight flyWeight = new Neibu(color);
                map.put(color, flyWeight);
                return flyWeight;
            }
            
        }
        
    }
    public static void main(String[] args) {
            FlyWeight f1 = FlyWeightFactory.get("白色");
            FlyWeight f2 = FlyWeightFactory.get("白色");
            f1.diplay(new Waibu("25", "25"));
            f2.diplay(new Waibu("50", "50"));
        }

    白色和白色其实是一个对象不用创建两个,位置可由外部状态定义

  • 相关阅读:
    E:Could not get lock /var/lib/apt/lists/lock
    报错:shell-init: error retrieving current directory: getcwd: cannot access parent directories
    随记
    Linux下C++调用后端接口
    Python操作Execl
    使用CamFI设备二次开发,传输照片遇到的问题
    “Could not determine which "make" command to run. Check the "make" step in the build configuration.” 在Linux下 Qt图形库出错解决
    在Linux系统下Qt中获取相对路径
    C++命名空间
    css知识点汇总
  • 原文地址:https://www.cnblogs.com/jentary/p/5918244.html
Copyright © 2011-2022 走看看