大家好鸭!我是洪爵,又到了设计模式的时间啦~今天带给大家的是享元模式!
什么是享元模式捏?
首先,享元模式是一种结构型模式,那么啥是结构型模式?结构型模式更关注类和对象的组合。享元模式主要用于减少对象创建的数量,提高系统性能,减少内存消耗。那么它是怎么做的?享元模式旨在尝试重用现有的同类对象,如果找不到才创建。
享元模式也被广泛的应用在各个场景,比如说池技术,String常量池,数据库连接池,缓冲池等等。
那么享元模式它是怎么做到的呢?享元模式把其中共同的部分都抽象出来,如果有相同的需求,那么只需要返回内存中存在的这个对象就可以避免重复的去创建对象。
同时的,享元模式需要结合工厂模式辅助进行,不用担心,洪爵同时把工厂模式文章也放了出来呀!
享元模式会存有2种数据,一个是共享数据internalData,这部分数据是不会改变的;另外一个是externalData外部数据,这部分数据是不可以共享的,随时会改变。
享元模式主要包括以下几种角色:
抽象的享元类(FlyWeight):抽象出享元的基类或者接口,定义外部状态的接口,通过传参传入外部状态。
具体享元类(ConcreteFlyWeight):实现抽象享元类,为内部数据提供空间存储,同时实现operation方法。
享元工厂(FlyweightFactory):负责创建和管理享元对象。
客户端(Client):调用和获取具体对象。
上代码:
public interface FlyWeight {
void operation(String externalData);
}
public class ConcreteFlyWeight implements FlyWeight {
private String internalData;
public ConcreteFlyWeight(String internalData) {
this.internalData = internalData;
}
public void operation(String externalData) {
System.out.println("internalData = " + this.internalData);
System.out.println("externalData = " + externalData);
System.out.println("-------------------------------");
}
}
public class FlyweightFactory {
private static Map<String, ConcreteFlyWeight> pool = new ConcurrentHashMap<String, ConcreteFlyWeight>();
public static ConcreteFlyWeight getInstance(String internalData) {
if(pool.containsKey(internalData)) {
return pool.get(internalData);
}
System.out.println("first time to create " + internalData);
ConcreteFlyWeight concreteFlyWeight = new ConcreteFlyWeight(internalData);
pool.put(internalData, concreteFlyWeight);
return pool.get(internalData);
}
}
public class Client {
public static void main(String[] args) {
ConcreteFlyWeight concreteFlyWeight = FlyweightFactory.getInstance("美团");
concreteFlyWeight.operation("下订单1");
concreteFlyWeight = FlyweightFactory.getInstance("美团");
concreteFlyWeight.operation("下订单2");
concreteFlyWeight = FlyweightFactory.getInstance("饿了吗");
concreteFlyWeight.operation("下订单1");
concreteFlyWeight = FlyweightFactory.getInstance("饿了吗");
concreteFlyWeight.operation("下订单2");
concreteFlyWeight = FlyweightFactory.getInstance("美团");
concreteFlyWeight.operation("下订单3");
}
}
first time to create 美团
internalData = 美团
externalData = 下订单1
-------------------------------
internalData = 美团
externalData = 下订单2
-------------------------------
first time to create 饿了吗
internalData = 饿了吗
externalData = 下订单1
-------------------------------
internalData = 饿了吗
externalData = 下订单2
-------------------------------
internalData = 美团
externalData = 下订单3
-------------------------------
好啦,享元模式就讲到这里啦,世界竟如此简单呀!
愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。
道阻且长,往事作序,来日为章。
期待我们下一次相遇!