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

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

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

    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类就是外部状态。

  • 相关阅读:
    常见寻找OEP脱壳的方法
    Windows内核原理系列01
    HDU 1025 Constructing Roads In JGShining's Kingdom
    HDU 1024 Max Sum Plus Plus
    HDU 1003 Max Sum
    HDU 1019 Least Common Multiple
    HDU 1018 Big Number
    HDU 1014 Uniform Generator
    HDU 1012 u Calculate e
    HDU 1005 Number Sequence
  • 原文地址:https://www.cnblogs.com/shicaiyou/p/9364221.html
Copyright © 2011-2022 走看看