1 介绍
Flyweight模式是构造模式的一种,它通过和类似对象共享数据来减小内存占用。
举个栗子加深下理解:
对于喜欢简笔画的童鞋,在作画前,都会拿出心爱的笔袋,作画时,用到什么颜色的笔都会先看看笔袋中是否有这种颜色的笔对吧,如果有就直接取出来,没有的话再去买。如果每次用到笔都要去重新买的话,不仅会影响效率。而且浪费空间。<a>其实我们在生活中已经不自觉的在使用享元模式</a>
那么接下来我们就用代码来实现这一模式
2实现
享元模式的几个角色
- 抽象享元角色:所有具体享元角色的父类,定义一些需要实现的公共接口。
- 具体享元角色:抽象享元角色的具体实现,并实现了对应的方法。
- 享元工厂:具体负责享元的管理。
代码实现:
抽象享元角色:PenFlyweight.class
public abstract class PenFlyweight {
public abstract void showColor();
}
具体享元角色:Pen.class
public class Pen extends PenFlyweight{
private String color;
//构造一个笔
public Pen(String color) {
this.color = color;
}
//展示笔的颜色
@Override
public void showColor() {
System.out.println("笔的颜色:" + color);
}
}
享元工厂:PenFactory.class
public class PenFactory {
// 存储笔
private Map<String,PenFlyweight> pool = new HashMap<>();
//获取/创建铅笔
public PenFlyweight getPen(String color){
//从笔袋中找
PenFlyweight pen = pool.get(color);
if(pen == null){
// 如果没有找到,就创建一个放入笔袋
pen = new Pen(color);
pool.put(color, pen);
}
return pen;
}
//返回笔袋中笔的数量
public Integer getCount(){
return pool.size();
}
}
测试:MainClass.class
public class MainClass {
public static void main(String[] args) {
//创建一个空的笔袋
PenFactory factory = new PenFactory();
//依次放入三只笔
PenFlyweight redPen = factory.getPen("红色");
PenFlyweight bluePen = factory.getPen("蓝色");
PenFlyweight greenPen = factory.getPen("绿色");
System.out.println("笔袋中笔的数量:" + factory.getCount());
System.out.println("----------------------------------------");
//当从笔袋中找绿笔时,发现笔袋中有就不会再创建
PenFlyweight greenPen1 = factory.getPen("绿色");
System.out.println("笔袋中笔的数量:" + factory.getCount());
System.out.println("----------------------------------------");
//当从笔袋中找黑笔时,发现笔袋中没有,那么就会创建黑笔
PenFlyweight blackPen = factory.getPen("黑色");
System.out.println("笔袋中笔的数量:" + factory.getCount());
}
}
在java中的String类就是使用了享元模式,String对象时fianl修饰,对象一旦创建就不会被改变。享元模式在数据库连接池,线程池应用的也非常广泛。
喜欢的话戳一下喜欢呗。
有什么建议的话希望大家能在下方回复(●'◡'●)
上一篇:观察者模式-简shu,你欠我们一个朋友圈
下一篇:代理模式 - 你买的笔多少钱?