Java设计模式:享元模式

本文介绍了享元模式的基本概念,包括其定义、模式分类、应用场景及代码示例。享元模式通过共享技术有效支持大量细粒度对象,减少系统中对象的数量。

享元模式

定义:

运用共享技术有效地支持大量细粒度的对象。系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量。

模式结构:

Flyweight: 抽象享元类,所有具体享元类的超类或者接口,通过这个接口,Flyweight 可以接受并作用于外部专题。

ConcreteFlyweight: 具体享元类。指定内部状态,为内部状态增加存储空间。

UnsharedConcreteFlyweight: 非共享具体享元类。指出那些不需要共享的Flyweight子类。

FlyweightFactory: 享元工厂类,用来创建并管理Flyweight对象,它主要用来确保合理地共享Flyweight。

应用场景:

享元模式的核心是享元工厂类,享元工厂类维护了一个对象存储池,当客户端需要对象时,首先从享元池中获取,如果享元池中存在对象实例则直接返回,如果享元池中不存在,则创建一个新的享元对象实例返回给用户,并在享元池中保存该新增对象,这点有些单例的意思。

工厂类通常会使用集合类型来保存对象,如 HashMap、Hashtable、Vector 等等,在 Java 中,数据库连接池、线程池等都是用享元模式的应用。

代码示例:

我们以蚂蚁森林种树为例,每个种类的树都是共享的。

定义好树的信息

class Tree {

    private final String name;

    private final String color;

    private final Integer age;


    Tree(String name, String color, Integer age) {
        this.name = name;
        this.color = color;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public String getColor() {
        return color;
    }

    public Integer getAge() {
        return age;
    }
}

需要在哪个坐标上种树

class TreeNode {

    private Integer x;

    private Integer y;

    private Tree tree;

    TreeNode() {}

    TreeNode(Integer x, Integer y, Tree tree) {
        this.x = x;
        this.y = y;
        this.tree = tree;
    }

    public void plantTrees(){
        System.out.println("在蚂蚁森林("+x+","+y+")种了一棵"+tree.getAge()+"岁"+tree.getColor()+"的"+tree.getName());
    }

    public Integer getX() {
        return x;
    }

    public void setX(Integer x) {
        this.x = x;
    }

    public Integer getY() {
        return y;
    }

    public void setY(Integer y) {
        this.y = y;
    }

    public Tree getTree() {
        return tree;
    }

    public void setTree(Tree tree) {
        this.tree = tree;
    }
}

提供一个树工厂。在这里定义了一个ConcurrentHashMap 用来存储各个对象,用户需要对象时,首先从享元池中获取,如果享元池中不存在,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。

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

class TreeFactory {

    private static Map<String,Tree> treeMap = new ConcurrentHashMap<String,Tree>(16);

    public static Tree getTree(String name,String color,Integer age){
        if(treeMap.containsKey(name)){
            return treeMap.get(name);
        }
        Tree tree = new Tree(name, color, age);
        treeMap.put(name,tree);
        return tree;
    }

}

可以种树啦!客户端的使用

public class Flyweight {

    public static void main(String[] args) {

        new TreeNode(5,10,TreeFactory.getTree("俊俊树","绿色",2)).plantTrees();
        new TreeNode(10,20,TreeFactory.getTree("俊俊树","绿色",1)).plantTrees();
        new TreeNode(46,80,TreeFactory.getTree("胡杨","绿色",5)).plantTrees();
        new TreeNode(3,56,TreeFactory.getTree("红柳","红色",1)).plantTrees();

    }

}

运行效果:

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值