享元模式
享元模式的角色划分:
1,抽象享元角色:享元角色需要实现的公共接口。外蕴状态可以通过商业方法以参数的形式传入。
2,具体享角色:负责维护内蕴状态。且提供内蕴含状态的空间。内蕴状态不与环境有关,对象初始化时,内蕴含状态就已经产生。
3,享元工厂角色:负责维护和管理享元角色,在工厂中没有找到相应的享元对象,则负责创建相应的享元对象。
?本质工厂角色应该是个享元对象的容器。
4,客户端角色:自行维护外蕴状态,外蕴跟环境有关。
享元模式分单纯享元模式和复合享元模式
?这里就讲讲单纯享元模式。 下面以不同口味的冰棒为例。
//冰棒接口
public interface? Popsicle{
? //商业方法
?? public void buy();
?
}
?
//具体享元对象
public class GreenPeasPopsicle implments Popsicle{
?? //不同风味的雪糕,绿豆,荔枝味等 内蕴状态
??? String?? flavor = null;
?? public GreenPeasPopsicle(String flavor){
?????????????? this.flavor = flavor;
? }
//客人购买不同味道的雪糕
?public void buy(){
??? System.out.println("当钱被购买的雪糕风味是="+this.flavor);
}
//返回雪糕的名字
public String getFlavor(){
???? return flavor;
?}
}
?
//风味工厂类,可以单实例
public class?? PopsicleFactory{
private Map<String ,Popsicle> popsicleMap = new HashMap<String,Popsicle>();
?
?private PopsicleFactory instance = new PopsicleFactory();
//私有构造方法
?private PopsicleFactory(){
??
?}
//得工厂实例
public static PopsicleFactory getInstance(){
? return instance;
?}?
?
//维护和管理享元对象的工厂
?public Popsicle factory(String flavor){
? if(StringUtils.isBlank(flavor)){
?? return null;
?}
?
? if(popsicleMap .contain(flavor)){
???? return popsicleMap.get(flavor);
? }
?
? Popsicle popsicle = new GreenPeasPopsicle(flavor);
? popsicleMap.put(flavor,popsicle);
?}
}
//客户端端调用
public class? Client{
? public static void main(String args){
? //我要绿豆为的雪糕
?? Popsicle greePopsicle = PopsicleFactory.getInstance().factory("雪糕味");
?? grerPopsicle.buy();
???greePopsicle = PopsicleFactory.getInstance().factory("荔枝味");
? greePopsicle .buy();
? greePopsicle = PopsicleFactory.getInstance().factory("雪糕味");
? greePopsicle .buy();
?}
}
?
//打印结果
当钱被购买的雪糕风味是=雪糕味
当钱被购买的雪糕风味是=荔枝味
当钱被购买的雪糕风味是=雪糕味
?这里其实雪糕味只创建一个对象。因为他们的内蕴状态风味(雪糕味)是一样的。是共享的。
模式使用场景:
1,?大量使用对象产生时。
2,对象产生的内蕴状态不依赖环境而发生改变。
优点:
?提搞了性能以及不要创建重复的大量对象
缺点:
??查错比较困难。?