提供支持大量細(xì)粒度對(duì)象共享的有效方法。
內(nèi)部狀態(tài):指對(duì)象共享出來(lái)的信息,存儲(chǔ)在享元對(duì)象內(nèi)部且不會(huì)隨環(huán)境的改變而改變。
外部狀態(tài):指對(duì)象得以依賴的一個(gè)標(biāo)記,是隨環(huán)境的改變而改變的、不可共享的狀態(tài)。
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("池中網(wǎng)站類型個(gè)數(shù):" +factory.getWebSiteTypeNums());
}
}
abstract class WebSite {
public abstract void use(User user);
}
class ConcretWebSite extends WebSite {
/** 內(nèi)部狀態(tài) */
private String type;
public ConcretWebSite(String type) {
this.type = type;
}
@Override
public void use(User user) {
System.out.println("網(wǎng)站的發(fā)布形式為:" + 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();
}
}
/** 外部狀態(tài) */
class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}