• 享元模式


    享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。

    在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态。

    享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够受大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时将它们传递进来,就可以通过共享大幅度地减少单个实例的数目。

    享元模式应用:如果一个应用程序用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

    字符串String 就运用享元模式,两个字符串是相同的实例。

    String a ="abc",String b="abc"

    围墙、五子棋、跳棋,它们都有大量的棋子对象,围棋、五子棋只有黑白两色、跳棋颜色略微多一些,但也是不太变化的,所以颜色应该是棋子的内部状态;而各个棋子之间的主要就是位置的不同,所以方位坐标就是应该棋子的外部状态。

    User类

    package FlyWeight;
    /**
     * 专门的类处理外部状态
     * 不同的博客、产品展示是客户不一样
     * 所以客户就是外部状态
     * @author 煞笔
     *
     */
    public class User {
        private Long id;
        private String name;
        
        public User(Long id, String name) {
            super();
            this.id = id;
            this.name = name;
        }
        public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
    }
    Website 
    package FlyWeight;
    
    public abstract class Website {
        public abstract void show(User user);
    }

    ShareWebsite类

    package FlyWeight;
    /**
     * 需要共享的对象,来降低内存的损耗
     * 在享元对象内部,并且不会随环境改变
     * 处理内部状态
     * @author 煞笔
     *
     */
    public class ShareWebsite extends Website {
        private String type;
        
        public ShareWebsite(String type) {
            super();
            this.type = type;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        @Override
        public void show(User user) {
            System.out.println("欢迎"+user.getName()+"登录"+type);
        }
    
    }

    WebsiteFactory类

    package FlyWeight;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 创建并管理共享网站对象的工厂
     * @author 煞笔
     *
     */
    public class WebsiteFactory {
        public Map<String,ShareWebsite> websites = new HashMap<String,ShareWebsite>();
        public ShareWebsite getWebsite(String type){
            if(websites.containsKey(type)){
                return websites.get(type);
            }else{
                ShareWebsite website = new ShareWebsite(type);
                websites.put(type, website);
                return website;
            }
        }
        public int getWebsiteCount(){
            return websites.size();
        }
    }

    UnShareWebsite类

    package FlyWeight;
    /**
     * 不需要共享的对象
     * @author 煞笔
     *
     */
    public class UnShareWebsite extends Website {
    
        @Override
        public void show(User user) {
            System.out.println("用户"+user.getName()+"的独特的内容");
        }
    
    }

    Business类

    package FlyWeight;
    
    public class Business {
        public static void main(String[] args){
            WebsiteFactory factory = new WebsiteFactory();
            ShareWebsite bk1 = factory.getWebsite("博客");
            bk1.show(new User(1L,"大A"));
            ShareWebsite bk2 = factory.getWebsite("博客");
            bk2.show(new User(2L,"大B"));
            ShareWebsite bk3 = factory.getWebsite("博客");
            bk3.show(new User(3L,"大C"));
            ShareWebsite cp1 = factory.getWebsite("产品展示");
            cp1.show(new User(4L,"品A"));
            ShareWebsite cp2 = factory.getWebsite("产品展示");
            cp2.show(new User(5L,"品B"));
            ShareWebsite cp3 = factory.getWebsite("产品展示");
            cp3.show(new User(6L,"品C"));
            System.out.println("网站分类数目:"+factory.getWebsiteCount());
            UnShareWebsite unws = new UnShareWebsite();
            unws.show(new User(7L,"不一般"));
        }
    }

    欢迎大A登录博客
    欢迎大B登录博客
    欢迎大C登录博客
    欢迎品A登录产品展示
    欢迎品B登录产品展示
    欢迎品C登录产品展示
    网站分类数目:2(就只有两个实例)
    用户不一般的独特的内容

     
  • 相关阅读:
    LeetCode (160) Intersection of Two Linked Lists
    cmake命令 安装、用法简介
    算法——回文解密,判断一个数组是否为回文
    发现一个好用的播放插件---ckplayer
    阿里云ESC上的Ubuntu图形界面的安装
    tomcat 启动本地项目,但是报错的是另一个项目错误导致的tomcat启动失败
    发现一个有趣的时间控件
    Comparator 排序优先级
    项目Exception,项目前面有红色的小叉×
    日常问题,JasperException
  • 原文地址:https://www.cnblogs.com/ccgjava/p/7183693.html
Copyright © 2020-2023  润新知