享元模式(Flyweight),運用共享技術有效地支持大量細粒度的對象恒序。
PS:比如String的對象三圆,利用享元模式概念,兩個棧指針指向同一個堆地址污呼。
享元模式可以避免大量非常相似類的開銷裕坊。在程序設計中,有時需要生產(chǎn)大量細粒度的類實例來表示數(shù)據(jù)燕酷。如果能發(fā)現(xiàn)這些實例除了幾個參數(shù)之外基本都是相同的籍凝,有時就能受大幅度地減少需要實例化的類的數(shù)量。如果能把那些參數(shù)移到類實例的外面苗缩,在方法調用時將它們傳遞進來饵蒂,就可以通過共享大幅度地減少單實例的數(shù)目。
主方法
public class main {
public static void main(String[] args) {
WebSiteFactory webSiteFactory = new WebSiteFactory();
WebSite fx = webSiteFactory.getWebSiteCategory("產(chǎn)品展示");
fx.use(new User("小菜"));
WebSite fy = webSiteFactory.getWebSiteCategory("產(chǎn)品展示");
fy.use(new User("大鳥"));
WebSite fz = webSiteFactory.getWebSiteCategory("產(chǎn)品展示");
fz.use(new User("嬌嬌"));
WebSite fl = webSiteFactory.getWebSiteCategory("博客");
fl.use(new User("老頑童"));
WebSite fm = webSiteFactory.getWebSiteCategory("博客");
fm.use(new User("桃谷六仙"));
WebSite fn = webSiteFactory.getWebSiteCategory("博客");
fn.use(new User("南海鱷神"));
System.out.println(String.format("得到網(wǎng)站分類總數(shù)為:{%d}", webSiteFactory.countWebSite()));
}
}
用戶類
public class User {
public User(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
享元抽象類
/**
* 網(wǎng)站抽象類
*/
public abstract class WebSite {
public abstract void use(User user);
}
享元實現(xiàn)類
/**
* 具體網(wǎng)站類
*/
public class WebSiteImpl extends WebSite {
private String name = "";
public WebSiteImpl(String name) {
this.name = name;
}
public void use(User user) {
System.out.println("網(wǎng)站分類:" + name + " 用戶:" + user.getName());
}
}
享元工廠類
import java.util.concurrent.ConcurrentHashMap;
public class WebSiteFactory {
private ConcurrentHashMap<String, WebSiteImpl> flyweights = new ConcurrentHashMap<String, WebSiteImpl>();
public WebSite getWebSiteCategory(String key) {
if (!flyweights.contains(key)) {
flyweights.put(key, new WebSiteImpl(key));
}
return flyweights.get(key);
}
public int countWebSite() {
return flyweights.size();
}
}