设计模式——享元模式

Posted 刘永祥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式——享元模式相关的知识,希望对你有一定的参考价值。

享元模式里面的享则共享的意思,很明显就是共享资源,作用也就很明显运用共享技术有效地支持大量细粒度的对象。如果有很多歌完全相同或相似的对象,我们就可以通过共享模式来节省内存。
享元对象能做到的共享的关键是区分了内部状态和外部状态。内部状态:可以共享,不会随环境变化而改变。外部状态:不可以共享,会随环境变化而改变。共享单车想必大家都很熟悉吧。共享单车其实也是享元模式的体现。单车的颜色,形状,大小,重量这些是可以共享的就称之为内部状态,因为这些特征是它们所共有的,不会随环境变化而改变。而单车被摆放的位置是不可以共享的则是外部状态。
享元模式的参与者有
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 是同一个对象。到这里享元模式也就结束了。整个结构型模式也就介绍完了,后期将会继续介绍行为模式。

以上是关于设计模式——享元模式的主要内容,如果未能解决你的问题,请参考以下文章

享元模式

Python 设计模式 — 结构型模式 — 享元模式

Python 设计模式 — 结构型模式 — 享元模式

Java进阶篇设计模式之七 ----- 享元模式和代理模式

设计模式(十三)——享元模式

设计模式-享元模式