一、什么是享元模式
Flyweight模式也叫享元模式,是构造型模式之 一,它通过与其他类似对象共享数据来减小内存 占用。
二、享元模式的结构
三、享元模式的角色和职责
抽象享元角色:
所有具体享元类的父类,规定一些需要实现的公共接口。 具体享元角色:
抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法。 享元工厂角色: 负责创建和管理享元角色。
//示例1:
public class MyCharacter {//享元角色
private char mychar;
public MyCharacter(char mychar)
{
this.mychar = mychar;
}
public void display()
{
System.out.println(mychar);
}
}
import java.util.HashMap;
import java.util.Map;
public class MyCharacterFactory {//享元工厂
private Map<Character,MyCharacter> pool;
public MyCharacterFactory()
{
pool = new HashMap<>();
}
public MyCharacter getMyCharacter(Character character)
{
MyCharacter myChar = pool.get(character);
if(myChar == null)
{
myChar = new MyCharacter(character);
pool.put(character, myChar);
}
return myChar;
}
}
public class MainClass {
public static void main(String[] args) {
/* MyCharacter m1 = new MyCharacter('a');
MyCharacter m2 = new MyCharacter('b');
MyCharacter m3 = new MyCharacter('a');
MyCharacter m4 = new MyCharacter('d');
m1.display();
m2.display();
m3.display();
m4.display();
if(m1 == m3)
{
System.out.println("true");
} else {
System.out.println("false");
}*/
/*
//a
//b
//a
//d
//true
//
*/
//1.创建MyCharacter工厂
MyCharacterFactory factory = new MyCharacterFactory();
//2.从工厂中取出相应的MyCharacter
MyCharacter m1 = factory.getMyCharacter('a');
MyCharacter m2 = factory.getMyCharacter('b');
MyCharacter m3 = factory.getMyCharacter('a');
MyCharacter m4 = factory.getMyCharacter('d');
m1.display();
m2.display();
m3.display();
m4.display();
if(m1 == m3)
{
System.out.println("true");
} else {
System.out.println("false");
}
}
}
//a
//b
//a
//d
//true
//
//示例2:
public class Teacher {
private String number;
public void setNumber(String number) {
this.number = number;
}
public String getNumber() {
return number;
}
public Teacher(){
super();
}
}
import java.util.HashMap;
import java.util.Map;
public class TeacherFactory {
public Map<String,Teacher> pool;
public TeacherFactory() {
pool = new HashMap<>();
}
public Teacher getTeacher(String number)
{
Teacher teacher = pool.get(number);
if(teacher == null)
{
teacher = new Teacher();
teacher.setNumber(number);
pool.put(number, teacher);
}
return teacher;
}
}
public class MainClass {
public static void main(String[] args) {
TeacherFactory factory = new TeacherFactory();
Teacher teacher1 = factory.getTeacher("0102034");
Teacher teacher2 = factory.getTeacher("0102035");
Teacher teacher3 = factory.getTeacher("0102034");
Teacher teacher4 = factory.getTeacher("0102037");
System.out.println(teacher1.getNumber());
System.out.println(teacher2.getNumber());
System.out.println(teacher3.getNumber());
System.out.println(teacher4.getNumber());
if(teacher1 == teacher3)
{
System.out.println("true");
} else
System.out.println("false");
}
}
//0102034
//0102035
//0102034
//0102037
//true