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

享元模式

定义

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

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());
    }
}

运行结果this

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

总结

好处

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

使用情景

  • 若是一个应用程序使用了大量的对象,而大量的这些对象形成了很大存储开销时就应该考虑应用
  • 对象的大多数状态能够外部状态,若是删除对象的外部状态,那么能够用相对较少的共享对象取代不少组对象,此时能够考虑应用。
相关文章
相关标签/搜索