(@WhiteTaken)設計模式學習——享元模式
阿新 • • 發佈:2017-10-19
ken import 都是 什麽 com str 字段 浪費 --
繼續學習享元模式。。。
乍一看到享元的名字,一頭霧水,學習了以後才覺得,這個名字確實比較適合這個模式。
享元,即共享對象的意思。
舉個例子,如果制作一個五子棋的遊戲,如果每次落子都實例化一個對象的話,那麽一個多人在線的遊戲,要實例化的對象就無窮無盡,
為了避免這種情況的發生,我們可以怎麽做呢。
試想一下,如果有個盛放對象的容器,用到什麽對象就拿出來,如果容器中沒有要用到的對象,那麽就創建新的對象,並放入容器中。
這樣資源就會得到充分的利用,也避免頻繁的創建對象,造成內存的浪費。
享元模式,就是做到了對象的重復使用,減小內存占用。
下面直接上代碼。依然是Java實現。
Person基類,定義一些人的基本信息。可以被其他關於人的類繼承。
1 public class Person { 2 private String name = ""; 3 private int age = 0; 4 private String sex = ""; 5 6 public Person(String name, int age, String sex) 7 { 8 this.name = name; 9 this.age = age; 10 this.sex = sex; 11 } 12 13 publicPerson() 14 { 15 16 } 17 18 public String getName() { 19 return name; 20 } 21 public void setName(String name) { 22 this.name = name; 23 } 24 public int getAge() { 25 return age; 26 } 27 public void setAge(int age) { 28 this.age = age; 29 } 30 public String getSex() { 31 return sex; 32 } 33 public void setSex(String sex) { 34 this.sex = sex; 35 } 36 }
Student類,繼承了Person基類,擁有自己獨立的方法,並加入了字段id。
1 public class Student extends Person{ 2 private String id = ""; 3 public Student(String name, int age, String sex, String id){ 4 super(name, age, sex); 5 this.id = id; 6 } 7 8 public Student() { 9 super(); 10 } 11 12 public String getId() { 13 return id; 14 } 15 16 public void setId(String id) { 17 this.id = id; 18 } 19 20 public void studentSpeak() 21 { 22 System.out.println("我的學號是:" + id); 23 } 24 }
StudentFactory類,享元模式的核心類,有容器pool,有對象拿出來用,沒有對象就創建對象。
1 import java.util.HashMap; 2 import java.util.Map; 3 4 public class StudentFactory { 5 private Map<String, Student> pool; 6 7 public StudentFactory() { 8 pool = new HashMap<String, Student>(); 9 } 10 11 public Student getStudent(String id){ 12 Student student = pool.get(id); 13 if(null == student){ 14 student = new Student(); 15 student.setId(id); 16 pool.put(id, student); 17 } 18 return student; 19 } 20 }
MainClass測試主類。
1 public class MainClass { 2 3 public static void main(String[] args) { 4 StudentFactory studentFactory = new StudentFactory(); 5 Student student1 = studentFactory.getStudent("10001"); 6 Student student2 = studentFactory.getStudent("10002"); 7 Student student3 = studentFactory.getStudent("10001"); 8 Student student4 = studentFactory.getStudent("10004"); 9 student1.studentSpeak(); 10 student2.studentSpeak(); 11 student3.studentSpeak(); 12 student4.studentSpeak(); 13 if(student1 == student3){ 14 System.out.println("=======同一個對象======"); 15 }else { 16 System.out.println("--------不同對象-------"); 17 } 18 } 19 }
測試結果。
由此可見,student1和student3是同一個對象。
此外還有一個概念需要註意一下,就是人們口中的對象池,對象池是享元模式的一個分支,但是和上邊的享元模式還是有區別的。
區別就在於,對象池中的對象都是相同的,而以上的享元模式的對象是不同的,並用id做了區分。需要好好體會一下。
希望大家共同進步,每天學到一點,積少成多。
Sweet Dream!!!
(@WhiteTaken)設計模式學習——享元模式