欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式之享元模式

程序员文章站 2022-10-03 12:02:14
享元模式:运用共享技术有效地支持大量细粒度的对象。 一个网站共享代码的例子: 这例子基本实现了享元模式共享对象的目的。也就是说,不管建几个网站,只要是“产品展示”,都是一样的,只要是“博客”,也是完全相同的。在享元对象内部并且不会随环境改变而改变的共享部分,可以称为共享对象的内部状态。而随环境改变而 ......

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

设计模式之享元模式

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

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