享元模式的思路整理

目的是为了节省不必要的重复开销,尽可能减少相似类的重复创建。
可以想象有一个地图,里面有很多树,但是种类就那么几种,
所以不需要创建太多的树对象,这种情况并不适合用单例,可以采用享元模式。

树节点对象:

package flyweight;

/**
 * @Auther: 苏察哈尔丶灿
 * @Date: 2020/8/7 15:40
 * @Slogan: 我自横刀向天笑,笑完我就去睡觉。
 */
public class Tree {
    public final String name;
    public final String data;

    public Tree(String name, String data) {
        this.name = name;
        this.data = data;
        System.out.println("Tree + " + this.name + " Created");
    }
}

工厂类:

package flyweight;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Auther: 苏察哈尔丶灿
 * @Date: 2020/8/7 15:42
 * @Slogan: 我自横刀向天笑,笑完我就去睡觉。
 */
public class TreeFactory {
    private Map<String, Tree> map = new ConcurrentHashMap<String, Tree>();

    public Tree getTree(String name,String data) {

        if(!map.containsKey(name)){
            map.put(name,new Tree(name,data));
        }

        return map.get(name);
    }

}

测试用例:

package flyweight;

/**
 * @Auther: 苏察哈尔丶灿
 * @Date: 2020/8/7 15:40
 * @Slogan: 我自横刀向天笑,笑完我就去睡觉。
 */
public class Test {
    public static void main(String[] args) {
        TreeFactory tf = new TreeFactory();
        tf.getTree("xxx","第一种树");
        tf.getTree("xxx","第一种树");


        tf.getTree("yyy","第二种树");
        tf.getTree("yyy","第二种树");
    }
}

执行结果如下:

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