设计模式——享元模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值