『設計模式』寫代碼偷懶小技巧,程序開發大智慧--享元模式

在這裏插入圖片描述

享元模式

享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存佔用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的方式。
享元模式講類的屬性分爲內外屬性(狀態),內屬性(狀態)可共享,通過內屬性結合傳入的外部屬性使用不同的功能(如棋盤橫縱座標,文字的字號顏色等),當相同內屬性對象存在時,重用現有對象,不存在該對象時創建該對象。

實現原理:

通過HashMap存儲現有對象,並通過唯一字段判斷內存中是否存在可共享的對象,如果存在即返回現有對象,不存在則創建對象並添加到HashMap中。

主要解決:

在有大量細粒度對象時需要被創建時,可能會佔用大量內存,爲了減少內存的使用量,我們把其中共同的部分抽象出來,如果有相同的業務請求,直接返回在內存中已有的對象,避免重新創建。
(網上很多說是爲了解決內存溢出,這裏本人認爲,解決內存溢出是減少內存用使用量帶來的,此設計模式並不是爲了解決內存溢出的問題而設計的,只是可以解決內存,主要目的還是減少內存使用量而且還是隻是在有大量細粒度對象被創建時纔會有效,不然也不會降低內存使用)

何時使用:

1、系統中有大量對象。 2、這些對象消耗大量內存。 3、這些對象的狀態大部分可以外部化。 4、這些對象可以按照內蘊狀態分爲很多組,當把外蘊對象從對象中剔除出來時,每一組對象都可以用一個對象來代替。 5、系統不依賴於這些對象身份,這些對象是不可分辨的。

優點:

大大減少對象的創建,降低系統的內存,使效率提高。

缺點:

提高了系統的複雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨着內部狀態的變化而變化,否則會造成系統的混亂。

實現:

UML(大話設計模式):
的
上面UML是比較經典的,以下是對上面的UML圖進行優化後的代碼!

 package 享元模式;

public interface Inter_Flyweight {
	public void Operation(int extrinsicstate);
}
package 享元模式;

public class ConcreteFlyweight implements Inter_Flyweight{		
	//
	
	@Override
	public void Operation(int extrinsicstate) {
		System.out.println("做一些具體的功能:"+extrinsicstate);
		
	} 
}

package 享元模式;

public class UnshareFlyweight implements Inter_Flyweight {
	@Override
	public void Operation(int extrinsicstate) {
		// TODO Auto-generated method stub
		System.out.println("不共享的的具體類:"+extrinsicstate);
	}
}

package 享元模式;

import java.util.HashMap;

public class Flyweight_Factory {
	private HashMap<String, Inter_Flyweight> flyweights = new HashMap<String, Inter_Flyweight>();

	public Flyweight_Factory() {
		flyweights.put("X", new ConcreteFlyweight());
		flyweights.put("Y", new ConcreteFlyweight());
		flyweights.put("Z", new ConcreteFlyweight());
	}

	public Inter_Flyweight getFlyweight(String s) {
		if (flyweights.get(s) == null)
			flyweights.put(s, new ConcreteFlyweight());

		return flyweights.get(s);
	}
	 
}

package 享元模式;

public class Client {

	public static void main(String[] args) {
		int method =0; //外部狀態
		Flyweight_Factory Fac=new Flyweight_Factory();
		
		Inter_Flyweight Fx=Fac.getFlyweight("x");
		Fx.Operation(method++);
		
		Inter_Flyweight Fy=Fac.getFlyweight("y");
		Fy.Operation(method++);
		
		Inter_Flyweight Fz=Fac.getFlyweight("z");
		Fz.Operation(method++);
		
		Inter_Flyweight FQ=Fac.getFlyweight("Q");
		FQ.Operation(method++);
		
		Inter_Flyweight UF=new UnshareFlyweight();
		UF.Operation(method);
	}

}

寫在最後:
Name:風骨散人,目前是一名雙非在校大學生,預計考研,熱愛編程,熱愛技術,喜歡分享,知識無界,希望我的分享可以幫到你!名字的含義:我想有一天我能有能力隨心所欲不逾矩,不總是向生活低頭,有能力讓家人擁有富足的生活而不是爲了生計而到處奔波。“世人慌慌張張,不過是圖碎銀幾兩。偏偏這碎銀幾兩,能解世間惆悵,可讓父母安康,可護幼子成長 …”
文章主要內容:
Python,C++,C語言,JAVA,C#等語言的教程
ACM題解、模板、算法等,主要是數據結構,數學和圖論
設計模式,數據庫,計算機網絡,操作系統,計算機組成原理
Python爬蟲、深度學習、機器學習
計算機系408考研的所有專業課內容
目前還在更新中,先關注不迷路。微信公衆號,cnblogs(博客園),CSDN同名“風骨散人”

如果有什麼想看的,可以私信我,如果在能力範圍內,我會發布相應的博文!
感謝大家的閱讀!😘你的點贊、收藏、關注是對我最大的鼓勵!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章