1. 程式人生 > >(@WhiteTaken)設計模式學習——享元模式

(@WhiteTaken)設計模式學習——享元模式

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     public
Person() 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)設計模式學習——享元模式