享元模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。典型的 String str = “abc”;如果有,则返回,如果没有则在字符串常量池中创建。
示例演示:
我们定义一个生物接口,生物接口中有一个说话的功能。
1
2
3
4
5
6
7
8
9package test.flyweight;
/**
* 所有生物的标识
*/
public interface Organism {
//所有生物共有的一个功能,有自己的沟通方式
String say();
}定义一个动物实体类,让他具有生物的性质。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package test.flyweight;
import lombok.Data;
public class Animal implements Organism {
private String name;
public Animal(String name) {
this.name = name;
}
public String say() {
return "my name is :" + name;
}
}创建一个工厂,用来创建和存储animal实体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package test.flyweight;
import java.util.HashMap;
import java.util.Map;
public class OrganismFactory {
private final static Map<String, Organism> animalMap = new HashMap<>();
public static Organism getAnimal(String name) {
Animal animal = (Animal) animalMap.get(name);
if (animal == null) {
animal = new Animal(name);
animalMap.put(name, animal);
System.out.println(animal.say()+"第一次创建");
}else{
System.out.println(animal.say()+"从池中取出");
}
return animal;
}
}完成上述步骤,我们就可以开始演示了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package test.flyweight;
public class FlyweightDemo {
public static void main(String[] args) {
String[] names = {"a", "b", "c", "d"};
for (int i = 0; i < 10; i++) {
OrganismFactory.getAnimal(names[getIndex()]);
}
}
private static Integer getIndex() {
return (int) (Math.random() * 4);
}
}运行结果:
1
2
3
4
5
6
7
8
9
10my name is :d第一次创建
my name is :d从池中取出
my name is :a第一次创建
my name is :b第一次创建
my name is :c第一次创建
my name is :c从池中取出
my name is :c从池中取出
my name is :c从池中取出
my name is :a从池中取出
my name is :d从池中取出
说明:
在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。大大减少对象的创建,降低系统的内存,使效率提高;缺点是提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。