• 设计模式之享元模式


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

    一个网站共享代码的例子:

    public abstract class Website1 {
        public abstract void use(User user);
    }
    public class User {
        private String name;
        public User(String name){
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    public class ConcreteWebsite1 extends Website1{
        private String name="";
        public ConcreteWebsite1(String name){
            this.name = name;
        }
        @Override
        public void use(User user) {
            // TODO Auto-generated method stub
            System.out.println("网站分类:" + name + " 用户:" + user.getName());
        }
    
    }
    public class WebsiteFactory1 {
        private HashMap<String, Website1> websites = new HashMap<String, Website1>();
        public Website1 getWebsiteCategory(String key){
            if(!websites.containsKey(key)){
                websites.put(key, new ConcreteWebsite1(key));
            }
            return websites.get(key);
        }
        public int getWebsiteCount(){
            return websites.size();
        }
    }
    public class Test2 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            WebsiteFactory1 f = new WebsiteFactory1();
            Website1 fx = f.getWebsiteCategory("产品展示");
            fx.use(new User("xiaohei"));
            Website1 fy = f.getWebsiteCategory("产品展示");
            fy.use(new User("xiaohei2"));
            Website1 fz = f.getWebsiteCategory("产品展示");
            fz.use(new User("xiaohei3"));
            
            Website1 fl = f.getWebsiteCategory("博客");
            fl.use(new User("xiaohei4"));
            Website1 fm = f.getWebsiteCategory("博客");
            fm.use(new User("xiaohei5"));
            Website1 fn = f.getWebsiteCategory("博客");
            fn.use(new User("xiaohei6"));
            
            System.out.println("网站分类总数: " + f.getWebsiteCount());
        }
    
    }

    这例子基本实现了享元模式共享对象的目的。也就是说,不管建几个网站,只要是“产品展示”,都是一样的,只要是“博客”,也是完全相同的。在享元对象内部并且不会随环境改变而改变的共享部分,可以称为共享对象的内部状态。而随环境改变而改变的、不可以共享的状态就是外部状态了。享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据,如果发现这些实例除了几个参数外基本都是相同的,并且能把这些参数移到类实例的外面,在方法调用时传递进来,就可以通过共享大幅度地减少单个实例的数目。在上面的例子中,user类就是外部状态。

  • 相关阅读:
    物联网数据卡系统源码——物联网的主要应用领域
    一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
    memcached对key和value的限制 memcached的key最大长度和Value最大长度
    缓存技术PK:选择Memcached还是Redis?
    .Net开源框架列表
    项目管理工具Redmine各功能测试
    DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享
    ASP.NET Core 折腾笔记一
    发布:.NET开发人员必备的可视化调试工具(你值的拥有)
    开源发布:VS代码段快捷方式及可视化调试快速部署工具
  • 原文地址:https://www.cnblogs.com/shicaiyou/p/9364221.html
Copyright © 2020-2023  润新知