一袭景、什么是享元模式?
? ? ?定義:? ?主要用于減少創(chuàng)建對(duì)象的數(shù)量,以減少內(nèi)存占用和提高性能碍岔。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式浴讯,它提供了減少對(duì)象數(shù)量從而改善應(yīng)用所需的對(duì)象結(jié)構(gòu)的方式朵夏。
? ?通俗理解: 就是使用已經(jīng)存在的對(duì)象蔼啦,而非再去創(chuàng)建對(duì)象,項(xiàng)目中其實(shí)我們經(jīng)常用仰猖,只是不知道其實(shí)是享元模式捏肢,比如使用HashMap緩存鍵值對(duì)奈籽,當(dāng)去創(chuàng)建對(duì)象是,去map中查找是否存在鍵鸵赫,如果存在衣屏,直接返回對(duì)象,否則創(chuàng)建新的對(duì)象辩棒,并且放到map中狼忱。當(dāng)然這只是享元模式的一個(gè)簡(jiǎn)單案例。
二一睁、角色?
? ? ?1钻弄、抽象享元對(duì)象(可無)
? ? ?2、具體享元對(duì)象—>需要共享的對(duì)象?
? ? ?3者吁、享元對(duì)象的工廠—>創(chuàng)建對(duì)象窘俺,緩存對(duì)象
三、使用場(chǎng)景?
? ? 1复凳、系統(tǒng)有大量相似對(duì)象瘤泪。 2、需要緩沖池的場(chǎng)景育八。
三对途、案例? 比如隨機(jī)創(chuàng)建獲取一個(gè)圓形。
? 角色一: 抽象享元對(duì)象: IShape
? 角色二: 具體享元對(duì)象: Circle
? 角色三: 享元工廠
public interface IShape {
void draw();
}
public class Circle implements IShape {
private int radius;
? ? public Circle(int radius) {
this.radius = radius;
? ? }
@Override
? ? public void draw() {
Log.i("zqr", "繪制了一個(gè)半徑為:" +radius);
? ? }
}
public class CircleFactory {
private static HashMaphashMap =new HashMap<>();
? ? public static IShapegetCircle(int radius) {
// 沒必要每次都創(chuàng)建,可以判斷存在半徑為radius的圓髓棋,就使用已有的
? ? ? ? Circle circle;
? ? ? ? synchronized (hashMap) {
circle =hashMap.get(radius);
? ? ? ? ? ? if (circle ==null) {
circle =new Circle(radius);
? ? ? ? ? ? ? ? hashMap.put(radius, circle);
? ? ? ? ? ? }
}
return circle;
? ? }
}