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

大话设计模式笔记(二十三)の享元模式

程序员文章站 2022-04-11 18:17:08
享元模式 定义 运用共享技术有效的支持大量细粒度的对象。 UML图 举个栗子 实际开发当中,一个项目如果做得好,如果市场打通到其他地方,那么核心代码其实是可以通用的,只不过用着不同的数据和特性出来的模版而已,这些对用户来说是非透明的。使用最小的开销获得最大的收益,这是所有公司的目的。 Talk is ......

享元模式

定义

运用共享技术有效的支持大量细粒度的对象。

uml图

大话设计模式笔记(二十三)の享元模式

举个栗子

实际开发当中,一个项目如果做得好,如果市场打通到其他地方,那么核心代码其实是可以通用的,只不过用着不同的数据和特性出来的模版而已,这些对用户来说是非透明的。使用最小的开销获得最大的收益,这是所有公司的目的。

talk is cheap, show me the code

(屁话少说,放码过来)

/**
 * 网站抽象类
 * created by callmedevil on 2019/12/15.
 */
public abstract class website {
    public abstract void use(user user);
}
/**
 * 具体网站类
 * created by callmedevil on 2019/12/15.
 */
public class concretewebsite extends website{

    private string name = "";

    public concretewebsite(string name){
        this.name = name;
    }

    @override
    public void use(user user) {
        system.out.println("网站分类:" + name + " 用户:" + user.getname());
    }

}
/**
 * 网站工厂
 * created by callmedevil on 2019/12/15.
 */
public class websitefactory {

    private hashmap<string, website> flyweights = new hashmap<>();

    // 获得网站分类
    public website getwebsitecategory(string key){
        // 判断是否存在这个对象,如果存在则直接返回,若不存在则实例化再返回
        if (!flyweights.containskey(key)) {
            flyweights.put(key, new concretewebsite(key));
        }
        return flyweights.get(key);
    }

    // 获得网站分类总数
    public int getwebsitecount(){
        return flyweights.size();
    }

}
/**
 * 用户
 * created by callmedevil on 2019/12/15.
 */
public class user {

    private string name;

    public user(string name){
        this.name = name;
    }

    // 省略 get set
}
public class test {
    public static void main(string[] args) {
        websitefactory factory = new websitefactory();

        website fx = factory.getwebsitecategory("产品展示");
        fx.use(new user("路飞"));

        // 共享上方生成的对象,不再实例化
        website fy = factory.getwebsitecategory("产品展示");
        fy.use(new user("索隆"));

        website fz = factory.getwebsitecategory("产品展示");
        fz.use(new user("山治"));

        website fl = factory.getwebsitecategory("博客");
        fl.use(new user("娜美"));

        website fm = factory.getwebsitecategory("博客");
        fm.use(new user("乌索普"));

        website fn = factory.getwebsitecategory("博客");
        fn.use(new user("乔巴"));

        // 统计实例化个数,结果应为2
        system.out.println("网站分类总数为:" + factory.getwebsitecount());
    }
}

运行结果

网站分类:产品展示 用户:路飞
网站分类:产品展示 用户:索隆
网站分类:产品展示 用户:山治
网站分类:博客 用户:娜美
网站分类:博客 用户:乌索普
网站分类:博客 用户:乔巴
网站分类总数为:2

总结

好处

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

使用情景

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