1 介绍
享元,享元,共享元素,主要用于减少创建对象的数量,以减少内存占用和提高性能。说白了就是如果要创建同样的对象(只读不写),可以使用这种设计模式节省空间。
2 例子
用一个榨汁机的例子来描述,可能抽象的有些不对,但是核心内容应该是可以体会到。
2.1 果汁接口
//果汁接口
interface Juice{
//榨出果汁
void juicer();
//获得水果的名字
String getFruitName();
}
2.2 水果实体(实现果汁接口)
//水果
class Fruit implements Juice{
private String fruitName;
Fruit(String name){
this.fruitName=name;
}
@Override
public void juicer() {
System.out.println("正在榨"+this.fruitName+"汁");
}
@Override
public String getFruitName() {
return this.fruitName;
}
}
2.3 榨汁机工厂(核心)
//榨汁机
class Juicer{
//用来放水果
private Map<String,Juice> fruitPool=new HashMap<String,Juice>();
//判断加入
public Juice getJuice(String fruitName){
if(!fruitPool.containsKey(fruitName)){
fruitPool.put(fruitName,new Fruit(fruitName));
}
fruitPool.get(fruitName).juicer();
return fruitPool.get(fruitName);
}
//获得长度
public int getSize(){
return fruitPool.size();
}
}
注意:该类有一个存放水果汁的缓存空间,要是缓存有就直接返回,没有才new一个。
2.4 测试主类
public class Main {
public static void main(String[] args) {
Juicer juicer=new Juicer();
Juice appleJuice=juicer.getJuice("苹果");
Juice appleJuice1=juicer.getJuice("苹果");
Juice appleJuice2=juicer.getJuice("苹果");
Juice appleJuice3=juicer.getJuice("苹果");
Juice appleJuice4=juicer.getJuice("苹果");
Juice bananaJuice=juicer.getJuice("香蕉");
System.out.println(juicer.getSize());
}
}
运行结果:
正在榨苹果汁
正在榨苹果汁
正在榨苹果汁
正在榨苹果汁
正在榨苹果汁
正在榨香蕉汁
2
虽然苹果汁获取了5次,但是工厂里面只new了一个,都是在共享它的内存地址。
3 总结
享元模式的核心在于元素共享,对于这种只读不写的数据,可以尝试使用,实现是在别人调用get方法获取对象的时候首先去缓存取找一找,看有没有,要是有就直接返回,没有才new。