一、什么是享元模式?
? ? ?定義:? ?主要用于減少創(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ì)象(可無(wú))
? ? ?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;
? ? }
}