设计模式之避免浪费_Flyweight享元模式_共享对象避免浪费
前言
Github:https://github.com/HealerJean
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());
}
}