享元模式
FlyWeight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享来减小内存占用。
一、结构与角色
- 抽象享元角色:所有具体享元类的父类,规定一些需要实现的公共接口
- 具体享元角色:抽象享元角色的具体角色类,并实现了抽象享元角色规定的方法
- 享元工程角色:负责创建和管理享元角色
二、示例代码
当我们需要拼写applause的时候,里面是两个a两个p,如果采用单纯new对象的形式,则会造成内存浪费,利用享元模式便可解决此问题,利用map创建池来管理享元对象,从工厂中获取字母,在调用享元对象的display方法即可
2.1 MyCharacter
//享元角色,共享对象的字母去拼写单词,节省内存
public class MyCharacter {
private char oneChar;
public MyCharacter(char oneChar){
this.oneChar = oneChar;
}
public void display(){
System.out.print(oneChar);
}
}
2.2 MyCharacterFactory
public class MyCharacterFactory {
private Map<Character,MyCharacter> charPool;
public MyCharacterFactory(){
charPool = new HashMap<Character, MyCharacter>();
}
public MyCharacter getMyCharacter(Character character){
MyCharacter myCharacter = charPool.get(character);
if(myCharacter == null){
myCharacter = new MyCharacter(character);
charPool.put(character,myCharacter);
}
return myCharacter;
}
}
2.3 MainClass
public class MainClass {
public static void main(String[] args) {
//不采用享元模式
MyCharacter myCharacter1 = new MyCharacter('a');
MyCharacter myCharacter2 = new MyCharacter('a');
System.out.println(myCharacter1==myCharacter2);
//采用享元模式
MyCharacterFactory myCharacterFactory = new MyCharacterFactory();
MyCharacter myCharacter3 = myCharacterFactory.getMyCharacter('a');
MyCharacter myCharacter4 = myCharacterFactory.getMyCharacter('a');
myCharacter3.display();
myCharacter4.display();
System.out.println();
System.out.println(myCharacter3==myCharacter4);
}
}
//运行结果
false
aa
true