何為享元模式,大家不要被這個陌生的詞匯所嚇倒揍堕,其實筆者感覺這個是最容易理解的,下面請看筆者分析楔壤。
享元模式:
所謂享元模式鹤啡,就是相同對象,在內(nèi)存中之存在一份蹲嚣,大家都共享著一個實例對象。代碼體現(xiàn)上很像工廠模式祟牲,通過工廠找到這個對象隙畜,如果存在就直接獲取,如果不存在就創(chuàng)建同時说贝,保存议惰,方便下次直接獲取。以下是代碼
- 定義接口乡恕,可以從這個里面獲得
/**
* Created by mac on 2017/6/4.
*/
public interface IFlyWeight {
String getName();
}
- 定義用戶實現(xiàn)類
public class UserFlyWeight implements IFlyWeight {
public String name;
public UserFlyWeight(String name){
this.name=name;
}
public String getName() {
return this.name;
}
}
- 具體實現(xiàn)
/*
* Created by mac on 2017/6/4.
*/
public class FlyWightFactory {
Map<String, IFlyWeight> fly = new HashMap<String, IFlyWeight>();
/**
* 存在就直接返回言询,不存在就創(chuàng)建保存并返回
* @param name
* @return
*/
public IFlyWeight getFlyWeight(String name) {
IFlyWeight result = fly.get(name);
if (result == null) {
result = new UserFlyWeight(name);
fly.put(name, result);
}
return result;
}
}
在Flyweight模式中,由于要產(chǎn)生各種各樣的對象傲宜,所以在Flyweight(享元)模式中常出現(xiàn)Factory模式运杭。Flyweight的內(nèi)部狀態(tài)是用來共享的,Flyweight factory負責維護一個對象存儲池(Flyweight Pool)來存放內(nèi)部狀態(tài)的對象。Flyweight模式是一個提高[程序]效率和性能的模式,會大大加快程序的運行速度.
- 實驗
public class Main {
public static void main(String[] args) {
long start=System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
String name = "A";
String name2 = "B";
String name3 = "C";
FlyWightFactory.getFlyWeight(name).getName();
FlyWightFactory.getFlyWeight(name2).getName();
FlyWightFactory.getFlyWeight(name3).getName();
}
long end=System.currentTimeMillis();
System.out.format("耗時:%d,ms,map實例數(shù)量:%d",(end-start),FlyWightFactory.fly.size());
//耗時:63,ms,map實例數(shù)量:3
}
}
可以看到雖然從里面取了10萬次函卒,但是只用了63ms辆憔,切對于這些相同對象,內(nèi)存中之存在唯一的一份