前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、Flyweight享元模式

Flyweight (享元模式) 是轻量级的意思,通过尽量共享实例来避免new出新实例

1.1、解释

类似于String常量池,数据库连接池,没有的对象创建后存在池中,若池中存在该对象则直接从池中取出。

使用场景 :

1、系统中存在大量相似对象(不着急销毁)

2、需要缓冲池的场景

1.2、示例代码

1.2.1、抽象父类:AbstractWebSite

public abstract class AbstractWebSite {

    public abstract void operate(String message);

}

1.2.1.1、子类:ConcreteWebSite

public class ConcreteWebSite extends AbstractWebSite {

    private String name ;

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

    @Override
    public void operate(String message) {
        System.out.println("网站信息:" + message);
    }
}

1.2.2、享元工厂

对象存在则取用,对象不存在则创建

public class FlyweightFactory {

    private HashMap<String, ConcreteWebSite> pool = new HashMap<>();

    /**
     * 获得网站分类
     */
    public AbstractWebSite getWebSiteCategory(String key) {
        if (!pool.containsKey(key)) {
            pool.put(key, new ConcreteWebSite(key));
        }
        return pool.get(key);
    }

    /**
     * 获得网站分类总数
     */
    public int getWebSiteCount() {
        return pool.size();
    }
}

1.2.3、测试

public class D20Main {

    public static void main(String[] args) {
        //享元工厂
        FlyweightFactory factory = new FlyweightFactory();

        AbstractWebSite teachWebsite = factory.getWebSiteCategory("技术");
        teachWebsite.operate("SpringBoot");


        AbstractWebSite qgWebsite = factory.getWebSiteCategory("情感");
        qgWebsite.operate("爱情");


        System.out.println("网站分类总数为:" + factory.getWebSiteCount());
    }
}