享元模式里面的享则共享的意思,很明显就是共享资源,作用也就很明显运用共享技术有效地支持大量细粒度的对象。如果有很多歌完全相同或相似的对象,我们就可以通过共享模式来节省内存。 享元对象能做到的共享的关键是区分了内部状态和外部状态。内部状态:可以共享,不会随环境变化而改变。外部状态:不可以共享,会随环境变化而改变。共享单车想必大家都很熟悉吧。共享单车其实也是享元模式的体现。单车的颜色,形状,大小,重量这些是可以共享的就称之为内部状态,因为这些特征是它们所共有的,不会随环境变化而改变。而单车被摆放的位置是不可以共享的则是外部状态。 享元模式的参与者有 1.抽象享元角色:给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。 2.具体享元角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。 3.非具体享元角色:并非所有的抽象享元角色子类都需要被共享。抽象享元角色接口使共享成为可能,但它并不强制共享。 4.享元工厂角色:确保合理地共享抽象享元角色。当用户请求一个抽象享元角色时,如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。 享元模式的优点: 1.减少内存中对象的数量 2.相同或相似的对象在内存中只存在一份,节约资源,提高性能。 3.外部状态相对独立,不影响内部状态 缺点: 1.模式比较复杂,使应用程序的逻辑变得复杂化 2.为了节省内存,共享内部状态,分理处外部状态,而读取外部状态使得运行时间变长,牺牲时间换取空间。 抽象享元角色和具体享元角色类
/** * 抽象享元角色 */public interface Bicycle { String color(String color); String shape(); String size(); String weight(); String parkingPosition(ParkingPosition pg); }/** * 内部状态 * 具体享元角色 */class ConcreteBicycle implements Bicycle{PRivate String color; public ConcreteBicycle(String color) { super(); this.color = color;} @Override public String color(String color) { return color; } @Override public String shape() { return "单车的样式"; } @Override public String size() { return "单车的大小"; } @Override public String weight() { return "单车的重量"; } @Override public String parkingPosition(ParkingPosition pg) { System.out.println("单车颜色为--->"+color); return "停放位置为--->"+pg.getName(); }}非具体享元角色类
/** * 外部状态 * 非具体享元角色 */public class ParkingPosition {private String name;public ParkingPosition(String name) { super(); this.name = name;}public String getName() { return name;}public void setName(String name) { this.name = name;}}享元工厂角色类
/** *享元工厂角色 */public class BicycleFactory {private static Map<String,Bicycle>bicycleMap = new HashMap<String,Bicycle>();public static Bicycle getBicycle(String color){ if (bicycleMap.get(color)!=null) { return bicycleMap.get(color); }else { Bicycle bicycle = new ConcreteBicycle(color); bicycleMap.put(color, bicycle); return bicycle; }}}测试代码
Bicycle bicycle1 = BicycleFactory.getBicycle("黄色");Bicycle bicycle2 = BicycleFactory.getBicycle("黄色");System.out.println("bicycle1--->"+bicycle1);System.out.println("bicycle2--->"+bicycle2);System.out.println(bicycle1.parkingPosition(new ParkingPosition("昌平区")));System.out.println(bicycle2.parkingPosition(new ParkingPosition("朝阳区")));运行效果截图 通过运行效果我们可以看到bicycle1 和bicycle2 是同一个对象。到这里享元模式也就结束了。整个结构型模式也就介绍完了,后期将会继续介绍行为模式。
新闻热点
疑难解答