- N +

设计模式之享元模式

设计模式之享元模式原标题:设计模式之享元模式

导读:

享元模式意图运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒...

文章目录 [+]

享元模式意图

运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。享元模式,也叫【轻量级模式】或者【蝇量级模式】。主要目的就是为了减少细粒度资源的消耗。比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了。

享元模式应用场景

      1 一个系统应用到了大量的对象,而且很多都是重复的。

      2 由于大量对象的使用,造成了存储效率上的开销。

      3 对象的状态大多是外部状态,不干扰状态本身。

      4 如果剔除这些外部状态,可以用一组小规模的对象表示共享对象。

享元模式角色

1)        抽象享元角色:为具体享元角色规定了必须实现的方法,而外蕴状态就是以参数的形式通过此方法传入。在java中可以由抽象类、接口来担当。

2)        具体享元角色:实现抽象角色规定的方法。如果存在内蕴状态,就负责为内蕴状态提供存储空间。

3)        享元工厂角色:负责创建和管理享元角色。要想达到共享的目的,这个角色的实现是关键!

4)        客户端角色:维护对所有享元对象的引用,而且还需要存储对应的外蕴状态。

享元模式代码示例-单纯享元模式

/**
 * 抽象享元角色类
 * 
 * @author mayou18
 *
 */
public interface ICustomerString {
    
    //外部状态以参数的形式通过此方法传入
    public void opt(String outState); 

}

/**
 * 具体享元角色类
 * 
 */
public class CustomerStringImpl implements ICustomerString{
    
    Character mInnerState=null;
    
    
    CustomerStringImpl(Character mInnerState){
        
        this.mInnerState=mInnerState;
    }
    

    @Override
    public void opt(String outState) {
        // TODO Auto-generated method stub
        
        System.out.println("外部状态:"+outState);
    }

}

//享元工厂角色类
//一般而言,享元工厂对象在整个系统中只有一个,因此也可以使用单例模式
public class CustomerStringFactory {
    
    private Map<Character, ICustomerString> map = new HashMap<>();

    public ICustomerString factory(Character state) {
        ICustomerString cacheTemp = map.get(state);
       
        if (cacheTemp == null) {
            cacheTemp = new CustomerStringImpl(state);
            map.put(state, cacheTemp);
        }
        
        return cacheTemp;
    }
       
}

客户端:
 public static void main(String[] args) {
        
        CustomerStringFactory factory=new CustomerStringFactory();
        
        ICustomerString f1=factory.factory(new Character('Y'));
        
        f1.opt("我是 Y");
        
        ICustomerString f2=factory.factory(new Character('M'));
        
        f2.opt("我是 M");
        
    }


享元模式优缺点

享元模式优点:

  • 可以极大减少内存中对象的数量,使得相同或相似对象在内存中只保存一份,从而可以节约系统资源,提高系统性能

  • 享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。

享元模式缺点:

  • 享元模式使得系统变得复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。

  • 为了使对象可以共享,享元模式需要将享元对象的部分状态外部化,而读取外部状态将使得运行时间变长。


本文标题:设计模式之享元模式
本文链接:http://www.kyjszj.com/wdzl/25.html
作者授权:除特别说明外,本文由 开源技术之家 原创编译并授权 开源技术之家 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。

有好的文章希望我们帮助分享和推广,猛戳这里我要投稿

返回列表
上一篇:
下一篇:

发表评论中国互联网举报中心

快捷回复:

    评论列表 (暂无评论,共701人参与)参与讨论

    还没有评论,来说两句吧...