享元模式 - 听说你的笔袋没笔了

1 介绍


Flyweight模式是构造模式的一种,它通过和类似对象共享数据来减小内存占用。

举个栗子加深下理解:
对于喜欢简笔画的童鞋,在作画前,都会拿出心爱的笔袋,作画时,用到什么颜色的笔都会先看看笔袋中是否有这种颜色的笔对吧,如果有就直接取出来,没有的话再去买。如果每次用到笔都要去重新买的话,不仅会影响效率。而且浪费空间。其实我们在生活中已经不自觉的在使用享元模式

享元模式 - 听说你的笔袋没笔了_第1张图片
what do you want?

那么接下来我们就用代码来实现这一模式

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 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,你欠我们一个朋友圈
下一篇:代理模式 - 你买的笔多少钱?

你可能感兴趣的:(享元模式 - 听说你的笔袋没笔了)