享元模式
摘要
本文通過簡潔的模式描述,應用場景的詳細代碼實現,以及匹配的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