导图社区 Java中的享元设计模式思维导图
现在在大力推行节约型社会,“浪费可耻,节俭光荣”。在软件系统中,有时候也会存在资源浪费的情况,那么,享元模式这种技术,就是实现对那些相同或者相似对象进行共享访问。
编辑于2019-12-12 08:30:23享元模式
源定义
使用共享对象可有效地支持大量的细粒度的对象.
特征
暴露静态方法获取粒子级对象
粒子级对象存放在Map
要获取的粒子级对象不存就创建对象,并存入Map,供下次获取
UML类图
角色说明
Flyweight(抽象享元角色)
接口或抽象类,可以同时定义出对象的外部状态和内部状态的接口或实现
抽象的享元
ConcreteFlyweight
实现抽象享元角色中定义的业务
具体的享元实现对象
UnsharedConcreteFlyweight
并不是所有的抽象享元类的子类都需要被共享
不能被共享的子类可设计为非共享具体享元类;
当需要一个非共享具体享元类的对象时可以直接通过实例化创建
该对象一般不会出现在享元工厂中
不可共享的享元角色
FlyweightFactory
管理对象池和创建享元对象
享元工厂
实现
最近共享单车非常火,就以共享单车为例。如果我们之前没用过共享单车的话,需要先交一份押金才能用;交过押金之后,第二次使用的话就可以直接用了,不用再次交押金。这就跟对象池非常像,如果池中没有这个对象的话,需要先创建一个对象;如果存在的话,则可以直接使用这个对象了。
实操
6.1 创建抽象享元角色Flyweight
定义一个单车接口,里面有个计费方法:
public interface IBike { void billing(int time); }
6.2 创建具体享元角色ConcreteFlyweight
创建共享单车类,其中单价是它的内部状态,不随环境而改变;总价是它的外部状态,随着环境改变而改变。
public class ShareBike implements IBike {//共享单车类 private int price = 1;//单价 private int total;//总价 @Override public void billing(int time) { total = price * time; System.out.println("骑车花费了" + total + "元"); } }
6.3 创建享元工厂FlyweightFactory
负责管理对象池和创建享元对象:
public class BikeFactory { private static Map<String, IBike> pool = new HashMap<>();//使用HashMap来保存IBike对象 public IBike getBike(String name) { IBike bike = null; if (pool.containsKey(name)) {//如果存在对象的话,直接使用 System.out.println("押金已交,直接用车:" + name); bike = pool.get(name); } else {//对象不存在的话,先创建对象 bike = new ShareBike(); pool.put(name, bike); System.out.println(name + "交100押金,可以用车了。"); } return bike; } }
6.4 客户端测试Client:
public void test() { BikeFactory factory=new BikeFactory(); IBike ofo = factory.getBike("ofo"); ofo.billing(2); IBike mobike = getBike("Mobike"); mobike.billing(1); IBike ofo1 = getBike("ofo"); ofo1.billing(3); }
ofo交100押金,可以用车了。 骑车花费了2元 Mobike交100押金,可以用车了。 骑车花费了1元 押金已交,直接用车:ofo 骑车花费了3元
应用场景
系统存在大量相似或相同的对象。
重复利用享元对象
外部状态相同类似情况下。
需要缓冲池时。
优点
大大减少了系统创建的对象,降低了程序内存的使用。