【設計模式學習筆記】享元模式
阿新 • • 發佈:2018-12-31
享元模式:主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。這種型別的設計模式屬於結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式。【菜鳥】
文章目錄
這個模式也比較簡單。比如我們要生產相同型號,但塗裝不同的寶馬。我們生產了黑色寶馬後,還有必要再去例項化一個寶馬,再去設定它的型號嗎?我們是不是直接換一下顏色就可以了?
怎麼說呢,你可以理解為直接setColor就生產了另外一輛寶馬。
這裡我們為了好看,還是使用工廠去生產寶馬,同時呢引入一個map用於存放我們已經生產的不同型別的寶馬,當我們需要更換塗裝時,直接從map中取出對應的型號,塗一下就好了。
1.1 寶馬車長這樣
package flyweight;
/************************************************
*@ClassName : BWMCar
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/15 0015 15:14】
*@Version : 1.0.0
*************************************************/
public class BWMCar {
private String name;
private String color;
public BWMCar(String name, String color) {
this.name = name;
this.color = color;
}
}
1.2 工廠是這樣塗裝的
map就相當於是倉庫,當你發現有個對應的車型沒塗色,拉過來塗一下。好了~當你沒發現對應的車型,沒辦法,我們又不能凃空氣,只能新造一款車型。造好以後,這種車型以後也是直接塗一下完事。
package flyweight;
import java.util.HashMap;
import java.util.Map;
/************************************************
*@ClassName : CarFactory
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/15 0015 15:16】
*@Version : 1.0.0
*************************************************/
public class CarFactory {
private static Map<String, BWMCar> bwmCarMap = new HashMap<>();
public static BWMCar getInstance(String name, String color){
BWMCar bwmCar = bwmCarMap.get(name);
if(bwmCar==null){
bwmCar = new BWMCar(name, color);
bwmCarMap.put(name, bwmCar);
}
return bwmCar;
}
}
1.3 塗塗塗
package flyweight;
/************************************************
*@ClassName : Test
*@Description : TODO
*@Author : NikolaZhang
*@Date : 【2018/12/15 0015 14:40】
*@Version : 1.0.0
*************************************************/
public class Test {
public static void main(String[] args) {
System.out.println(CarFactory.getInstance("bwm1","black"));
System.out.println(CarFactory.getInstance("bwm1","grey"));
System.out.println(CarFactory.getInstance("bwm2","grey"));
System.out.println(CarFactory.getInstance("bwm1","blue"));
}
}
1.4 結果
可以看到bwm1型別的車都是一個地址,這就是減少建立物件的數量,以減少記憶體佔用和提高效能
。
參考
【菜鳥教程】:http://www.runoob.com/design-pattern/flyweight-pattern.html