享元模式
享元模式,从字面上就可以看出来,是对元素的共享,所以享元模式主要就是管理元素,进行共享
通常情况下,享元模式会和工厂模式一起使用,我看还是举个例子
线程池大家应该都不陌生,即使不了解的同学,应该也听过这个名字。池使用的就是享元模式,除此之外,还有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》。