一、什么是享元模式
Flyweight模式也叫享元模式,是构造型模式之
一,它通过与其他类似对象共享数据来减小内存占用。
二、享元模式结构
接口(可省略)
三、享元模式的角色即职责
抽象享元角色:
所有具体享元类的父类,规定一些需要实现的公共接口。
具体享元角色:
抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法。
享元工厂角色:
负责创建和管理享元角色。
四、享元模式实例
step1:
package com.dzg.learn.flyweight;
public class MyCharacter {
private String mychar;
public MyCharacter(String mychar) {
this.mychar = mychar;
}
public void display(){
System.out.println(mychar);
}
}
step2:
package com.dzg.learn.flyweight;
import java.util.HashMap;
import java.util.Map;
public class MyCharacterFactory {
private Map<String,MyCharacter> pool;
public MyCharacterFactory() {
pool = new HashMap<String, MyCharacter>();
}
public MyCharacter getMyCharacter(String str){
MyCharacter myChar = pool.get(str);//返回character键所对应的值
if(myChar == null){
/*
若myChar为空,则为其申请一个内存空间,
并将其放入已有的数据池中,下次进行创建新的数据时,在数据池中进行搜索,
若存在直接使用,否则创建新的,从而达到节省内存的目的
*/
myChar = new MyCharacter(str);
pool.put(str,myChar);
}
return myChar;
}
}
step3:
package com.dzg.learn.flyweight;
public class TestFlyCharacter {
public static void main(String[] args) {
/*MyCharacter character1 = new MyCharacter("a");
MyCharacter character2 = new MyCharacter("b");
MyCharacter character3 = new MyCharacter("a");
MyCharacter character4 = new MyCharacter("d");
character1.display();
character2.display();
character3.display();
character4.display();
System.out.println(character1 == character3); //false说明两个数是指向不同的引用,占用不同的内存空间
*/
//1.创建工厂
MyCharacterFactory factory = new MyCharacterFactory();
//2.从工厂中取出相应的MyCharacter
MyCharacter str1 = factory.getMyCharacter("aaa");
MyCharacter str2 = factory.getMyCharacter("bbb");
MyCharacter str3 = factory.getMyCharacter("aaa");
MyCharacter str4 = factory.getMyCharacter("ccc");
str1.display();
str2.display();
str3.display();
str4.display();
System.out.println(str1 == str3); //true str1和str2指向相同内存空间,达到节省内存的目的
}
}