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"));
        }

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

  • 相关阅读:
    asp.net中session的原理及应用
    通过SessionID和用户名来保证同一个用户不能同时登录(单点登录)
    ASP.NET中application对象的用法
    Tornado Web 框架
    LinkCode 下一个排列、上一个排列
    python版本与编码的区别
    python基本数据类型——set
    python基本数据类型——int
    python基本数据类型——str
    python基本数据类型——list
  • 原文地址:https://www.cnblogs.com/jentary/p/5918244.html
Copyright © 2011-2022 走看看