Radio

一个小小程序员

0%

享元模式

享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。典型的 String str = “abc”;如果有,则返回,如果没有则在字符串常量池中创建。

示例演示:
  1. 我们定义一个生物接口,生物接口中有一个说话的功能。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test.flyweight;

    /**
    * 所有生物的标识
    */
    public interface Organism {
    //所有生物共有的一个功能,有自己的沟通方式
    String say();
    }
  2. 定义一个动物实体类,让他具有生物的性质。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package test.flyweight;

    import lombok.Data;

    @Data
    public class Animal implements Organism {

    private String name;

    public Animal(String name) {
    this.name = name;
    }

    @Override
    public String say() {
    return "my name is :" + name;
    }
    }
  3. 创建一个工厂,用来创建和存储animal实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package 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;
    }

    }
  4. 完成上述步骤,我们就可以开始演示了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package 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
    10
    my 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从池中取出
说明:

在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。大大减少对象的创建,降低系统的内存,使效率提高;缺点是提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

欢迎关注我的其它发布渠道