设计模式之十享元模式

基本介绍

1) 享元模式(Flyweight Pattern) 也叫 蝇量模式: 运 用共享技术有效地支持大量细粒度的对象

2) 常用于系统底层开发,解决系统的性能问题。像 数据库连接池,里面都是创建好的连接对象,在 这些连接对象中有我们需要的则直接拿来用,避 免重新创建,如果没有我们需要的,则创建一个

3) 享元模式能够解决重复对象的内存浪费的问题, 当系统中有大量相似对象,需要缓冲池时。不需 总是创建新对象,可以从缓冲池里拿。这样可以 降低系统内存,同时提高效率

4) 享元模式经典的应用场景就是池技术了,String常 量池、数据库连接池、缓冲池等等都是享元模式 的应用,享元模式是池技术的重要实现方式

uml类图

 

 

案例

1) 应用实例要求 使用享元模式完成,前面提出的网站外包问题

 uml类图

 代码实现

package com.hy.flyweight;

/**
 * @author hanyong
 * @date 2020/11/24 1:14
 */
public abstract class Website {
    public abstract void use(User user);
}

package com.hy.flyweight;

/**
 * @author hanyong
 * @date 2020/11/24 1:16
 */
public class ConcreteWebSite extends Website {
    private String type = "";

    public ConcreteWebSite(String type) {
        this.type = type;
    }

    @Override
    public void use(User user) {
        System.out.println("网站的发布形式是" + type + "网站使用者是" + user.getName());
    }
}

package com.hy.flyweight;

import lombok.Getter;
import lombok.Setter;

/**
 * @author hanyong
 * @date 2020/11/24 1:29
 */
public class User {
    @Getter
    @Setter
    private String name;

    public User(String name) {
        this.name = name;
    }

}

package com.hy.flyweight;

import java.util.HashMap;

/**
 * @author hanyong
 * @date 2020/11/24 1:19
 */
public class WebSiteFactory {
    private HashMap<String, Website> pool = new HashMap<>();

    public Website getWebsite(String type) {

        if (!pool.containsKey(type)) {
            pool.put(type, new ConcreteWebSite(type));
        }
        return pool.get(type);
    }

    public int getCount() {
        return pool.size();
    }
}

package com.hy.flyweight;

/**
 * @author hanyong
 * @date 2020/11/24 1:22
 */
public class Client {
    public static void main(String[] args) {
        WebSiteFactory webSiteFactory = new WebSiteFactory();
        Website website = webSiteFactory.getWebsite("微博");
        website.use(new User("佳佳"));

        Website website1 = webSiteFactory.getWebsite("微博");
        website1.use(new User("lili"));

        Website website2= webSiteFactory.getWebsite("微信");
        website2.use(new User("huanghuang"));
        System.out.println(webSiteFactory.getCount());
    }
}

 

 


posted @ 2020-11-24 01:36  yongzhewuwei  阅读(74)  评论(0编辑  收藏  举报