解決的問題
當創(chuàng)建了大量對象,可能會因為使用內(nèi)存過多而導(dǎo)致性能問題寝蹈,可以考慮使用 Flyweight Pattern(輕量級模式)李命。
例如,開發(fā)一個地圖軟件箫老,地圖上面需要標注 100 個感興趣的點:
Point
:
每個點中的 icon 是比較消耗內(nèi)存的封字,假設(shè)一個 icon 占 20kb,那么 100 個點的 icon 大概要消耗 2M 的內(nèi)存耍鬓。
因為很多 icon 其實都是一樣的阔籽,所以 Point 可以這樣設(shè)計可以減少內(nèi)存的消耗:
優(yōu)化后的Point
:
其中,每種 icon(PointIcon
)只會創(chuàng)建一個實例牲蜀,可以在不同Point
之間共享笆制。這樣設(shè)計,極大了減少了內(nèi)存的消耗涣达。這就是 Flyweight Pattern在辆。
代碼
PointType
:
package com.cong.designpattern.flyweight;
public enum PointType {
COFFEE,
STORE,
PARK,
}
PointIcon
:
package com.cong.designpattern.flyweight;
public class PointIcon {
public PointType type;
public byte[] icon;
public PointIcon(PointType type, byte[] icon) {
this.type = type;
this.icon = icon;
}
}
PointIconFactory
:
package com.cong.designpattern.flyweight;
import java.util.HashMap;
import java.util.Map;
public class PointIconFactory {
private static Map<PointType, PointIcon> icons = new HashMap<>();
public static PointIcon getIcon(PointType type) {
if (icons.containsKey(type)) return icons.get(type);
System.out.println("Create new PointIcon instance");
PointIcon icon = new PointIcon(type, null);
icons.put(type, icon);
return icon;
}
}
Point
:
package com.cong.designpattern.flyweight;
public class Point {
public int x;
public int y;
public PointIcon pointIcon;
public Point(int x, int y, PointIcon pointIcon) {
this.x = x;
this.y = y;
this.pointIcon = pointIcon;
}
}
Test code:
// 創(chuàng)建了3個Point,但是共享同一個PointIcon實例度苔,節(jié)省了內(nèi)存
Point p1 = new Point(1,1, PointIconFactory.getIcon(PointType.COFFEE));
Point p2 = new Point(2,2, PointIconFactory.getIcon(PointType.COFFEE));
Point p3 = new Point(3,3, PointIconFactory.getIcon(PointType.COFFEE));