android设计模式二十三式(十二)——享元模式(Flyweight)

享元模式

享元模式,从字面上就可以看出来,是对元素的共享,所以享元模式主要就是管理元素,进行共享

通常情况下,享元模式会和工厂模式一起使用,我看还是举个例子

线程池大家应该都不陌生,即使不了解的同学,应该也听过这个名字。池使用的就是享元模式,除此之外,还有String常量池,没有的对象创建后存在池中,若池中存在该对象则直接从池中取出。

举个栗子

有个电影院,只要客户看什么电影,它都能放,没有上架的电影也可以上架,电影院就是一个工厂,放不同的电影,电影是一个抽象类,有播放的功能,观众就是客户。

/**
 * @author: hx
 * @Time: 2019/5/17
 * @Description: Moive电影抽象类
 */
public abstract class Moive {
    public abstract void play(Audience audience);
}

/**
 * @author: hx
 * @Time: 2019/5/17
 * @Description: ShowMoive
 */
public class ShowMoive extends Moive {
    private String name;

    public ShowMoive(String name) {
        this.name = name;
    }


    @Override
    public void play(Audience audience) {
        System.out.println(audience+"观看电影:"+name);
    }
}

/**
 * @author: hx
 * @Time: 2019/5/17
 * @Description: Cinema
 */
public class Cinema {
    private HashMap<String,Moive> mHashMap = new HashMap<>();

    /**
     * 获取电影
     * @param key
     * @return
     */
    public Moive getMoive(String key) {
        if (!mHashMap.containsKey(key)) {
            mHashMap.put(key, new ShowMoive(key));
        }
        return mHashMap.get(key);
    }

    /**
     * 获取电影总数
     * @return
     */
    public int getMoiveCount(){
        return mHashMap.size();
    }
}

/**
 * @author: hx
 * @Time: 2019/5/17
 * @Description: Audience观众
 */
public class Audience {
    private String name;
    private int num;

    public Audience(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "Audience{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
}

 好,接下来组织去看电影咯

public static void main(String[] args){
    Cinema cinema = new Cinema();
    Moive moive = cinema.getMoive("无双");
    moive.play(new Audience("小明",15));
    Moive moive2 = cinema.getMoive("无双");
    moive2.play(new Audience("小红",16));
    Moive moive3 = cinema.getMoive("无双");
    moive3.play(new Audience("小杰",14));

    Moive moive4 = cinema.getMoive("快把我哥带走");
    moive4.play(new Audience("小胡",25));
    Moive moive5 = cinema.getMoive("快把我哥带走");
    moive5.play(new Audience("小陈",26));

    Moive moive6 = cinema.getMoive("Green Book");
    moive6.play(new Audience("小溪",26));
    Moive moive7 = cinema.getMoive("Green Book");
    moive7.play(new Audience("小香菇",27));

    System.out.println("电影数:"+cinema.getMoiveCount());
}

输出结果:
Audience{name='小明', num=15}观看电影:无双
Audience{name='小红', num=16}观看电影:无双
Audience{name='小杰', num=14}观看电影:无双
Audience{name='小胡', num=25}观看电影:快把我哥带走
Audience{name='小陈', num=26}观看电影:快把我哥带走
Audience{name='小溪', num=26}观看电影:Green Book
Audience{name='小香菇', num=27}观看电影:Green Book
电影数:3

 可以看到,实际上电影只有三部,但是一共有7个人在看三部不同的电影,其中小明,小红,小杰共享电影《无双》;小胡,小陈共享电影《快把我哥带走》,小溪,小香菇共享电影《Green Book》。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值