不得不会的23种Java设计模式(六)——享元模式

享元模式

  • 一、定义
  • 二、享元模式和单例模式的区别
  • 三、案例
  • 四、总结

一、定义

享元模式是构造型模式之一,它通过共享数据使得相同对象在内存中仅创建一个实例,以降低系统创建对象实例的性能消耗

二、享元模式和单例模式的区别

  • 单例是该类创建自己的对象,整个应用中只有1个对象
  • 享元模式根据需要共享,一般被享元工厂类创建,有可能有多个不同的对象实例进行共享

三、案例

package test.flyweight02;

/**
 * 抽象享元角色
 */
public interface Flyweight {
    /**
     * 业务逻辑处理
     */
    void operation(String business);
}

package test.flyweight02;

/**
 * ConcreteFlyweight是具体享元角色
 */
public class ConcreteFlyweight implements Flyweight {

    private Character character;

    /**
     * 构造函数,构造方法传入该参数只要为业务考虑是否使用,若不使用该参数,也可不传入。
     * @param character
     */
    public ConcreteFlyweight(Character character) {
        this.character = character;
    }


    @Override
    public void operation(String business) {
        System.out.println("业务逻辑处理"+business);
    }
}

package test.flyweight02;

import java.util.HashMap;
import java.util.Map;

/**
 * 一个享元工厂,用来创建并管理Flyweight对象,主要是用来确保合理地共享Flyweight,
 * 当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或创建一个实例。
 */
public class FlyweightFactory {
    private Map<Character,Flyweight> files = new HashMap<>();

    public Flyweight factory(Character character){
        Flyweight fly = files.get(character);
        if(null == fly){
            fly = new ConcreteFlyweight(character);
            files.put(character,fly);
        }
        return fly;
    }
}

package test.flyweight02;


import java.util.HashSet;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight fly1 = factory.factory('a');
        fly1.operation("First Call");

        Flyweight fly2 = factory.factory('b');
        fly2.operation("Second Call");

        Flyweight fly3 = factory.factory('a');
        fly3.operation("Third Call");
        Set<Flyweight> list = new HashSet<>();
        list.add(fly1);
        list.add(fly2);
        list.add(fly3);
        System.out.println("总共三次业务逻辑处理,调用的对象次数为"+list.size());


    }
}

不得不会的23种Java设计模式(六)——享元模式_第1张图片

四、总结

  • 享元模式理解起来比较简单,不用想的太过复杂
  • 享元模式里面包含了工厂模式
  • 使用场景1>系统中存在大量相似对象并消耗大量内存
    2>需要缓冲池的场景,对象复用

你可能感兴趣的:(设计模式,设计模式,java)