享元模式
定义:
运用共享技术有效地支持大量细粒度的对象。系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量。
模式结构:
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();
}
}
运行效果:

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

被折叠的 条评论
为什么被折叠?



