提供支持大量细粒度对象共享的有效方法。
内部状态:指对象共享出来的信息,存储在享元对象内部且不会随环境的改变而改变。
外部状态:指对象得以依赖的一个标记,是随环境的改变而改变的、不可共享的状态。
String
和Integer
使用了享元模式
package com.strife.pattern.flyweight;
import java.util.HashMap;
import java.util.Map;
/**
* 享元模式
*
* @author mengzhenghao
* @date 2022/5/30
*/
public class FlyWeight {
public static void main(String[] args) {
WebSiteFactory factory = new WebSiteFactory();
factory.getWebSite("新闻").use(new User("张三"));
factory.getWebSite("博客").use(new User("李四"));
factory.getWebSite("博客").use(new User("王五"));
factory.getWebSite("新闻").use(new User("赵六"));
System.out.println("池中网站类型个数:" +factory.getWebSiteTypeNums());
}
}
abstract class WebSite {
public abstract void use(User user);
}
class ConcretWebSite extends WebSite {
/** 内部状态 */
private String type;
public ConcretWebSite(String type) {
this.type = type;
}
@Override
public void use(User user) {
System.out.println("网站的发布形式为:" + type + ", 使用者为:" + user.getName());
}
}
class WebSiteFactory {
Map<String, ConcretWebSite> pool = new HashMap<>();
public WebSite getWebSite(String type) {
if (!pool.containsKey(type)) {
pool.put(type, new ConcretWebSite(type));
}
return pool.get(type);
}
public int getWebSiteTypeNums() {
return pool.size();
}
}
/** 外部状态 */
class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}