享元模式

摘要

  本文通過簡潔的模式描述,應用場景的詳細代碼實現,以及匹配的UML,詳解介紹了享元模式的原理及應用。本文可幫助讀者快速掌握享元模式,以便工作學習中使用享元模式。

一、享元模式

  在生活中,我們身邊有很多工具,當我們需要某一個工具時,首先是查看自己是否擁有該工具,如果沒有工具,則去買或製作一個,如果有工具,則直接拿來用,用完放在原處,等待下一次使用,但決不會馬上銷燬該工具。
  在編程中,某些對象也扮演着工具角色,它會被頻繁使用,如果每次使用時再創建,同時用完即銷燬,這樣會消耗太多資源,同時效率不高。
  享元模式就是指讓對象元素可以進行共享,就解決了頻繁使用的麻煩。享元模式在對象創建工廠中加入緩存技術即可。當需要創建一個對象時,先查看工廠中是否已經創建,如果創建了,則調用已有的對象,如果還沒創建則進行創建。

二、享元模式的實現

2.1 場景設計

  在學校系統中,經常會用到各個學生對象,如果用到時創建,用完時銷燬,效率太低。所以需要加入享元模式。

2.2 代碼實現

2.2.1 Student 學生抽象類

package ft.patterns.Flyweight;

public interface Student {
	// subject作爲外蘊狀態  對一個具體對象是變動數據
	public void study(String subject);
}

2.2.2 CollegeStudent 學生具體類

package ft.patterns.Flyweight;

public class CollegeStudent implements Student{
	// 內蘊狀態 對於一個具體對象是不變數據
	String name;
	
	// 不變數據作爲構造參數傳進入
	CollegeStudent(String name){
		this.name = name;
	}
	
	// 變動數據作爲方法參數傳入
	@Override
	public void study(String subject) {
		System.out.println(name+" is starting "+subject);
	}
}

2.2.3 StudentFactory 學生工廠類

package ft.patterns.Flyweight;

import java.util.HashMap;
import java.util.Map;

public class StudentFactory {
	public static Map<String,Student> studentMap;
	
	static {
		studentMap = new HashMap<String,Student>();
	}
	
	public static Student getStudent(String name) {
		Student student = null;
		if(!studentMap.containsKey(name)) {
			student = new CollegeStudent(name);
			studentMap.put(name, student);
		}
		else {
			student = studentMap.get(name);
		}
		return student;
	}
}

2.2.4 Main 測試類

package ft.patterns.Flyweight;

public class Main {
	public static void main(String[] args) {
		Student Tom = StudentFactory.getStudent("Tom");
		Student Damon = StudentFactory.getStudent("Damon");
		
		Tom.study("Math");
		Damon.study("Computer");
		
		Student Tom1 = StudentFactory.getStudent("Tom");
		Student Damon1 = StudentFactory.getStudent("Damon");	
		
		System.out.println("Tom  ====> "+Tom);
		System.out.println("Tom1  ====> "+Tom1);
		
		System.out.println("Damon  ====> "+Damon);
		System.out.println("Damon1  ====> "+Damon1);
	}
}

2.2.5 測試結果

Tom is starting Math
Damon is starting Computer
Tom ====> ft.patterns.Flyweight.CollegeStudent@5caf905d
Tom1 ====> ft.patterns.Flyweight.CollegeStudent@5caf905d
Damon ====> ft.patterns.Flyweight.CollegeStudent@27716f4
Damon1 ====> ft.patterns.Flyweight.CollegeStudent@27716f4

三、享元模式的UML圖

享元模式UML類圖

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 1813
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章