zoukankan      html  css  js  c++  java
  • 享元模式(Flyweight)

    享元模式可以分成单纯享元模式复合享元模式两种形式。

    单纯享元模式所涉及到的角色如下:

    • 抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。

    • 具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。

    • 享元工厂(FlyweightFactory)角色 :本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

    抽象享元接口

    public interface Flyweight {
       //一个示意性方法,参数state是外蕴状态
       public void operation(String state);
    }

    public class ConcreteFlyweight implements Flyweight {
       private Character intrinsicState = null;
       /**
        * 构造函数,内蕴状态作为参数传入
        * @param state
        */
       public ConcreteFlyweight(Character state){
           this.intrinsicState = state;
       }
       
       /**
        * 外蕴状态作为参数传入方法中,改变方法的行为,
        * 但是并不改变对象的内蕴状态。
        */
       @Override
       public void operation(String state) {
           // TODO Auto-generated method stub
           System.out.println("Intrinsic State = " + this.intrinsicState);
           System.out.println("Extrinsic State = " + state);
       }
    }

    享元工厂角色类,必须指出的是,客户端不可以直接将具体享元类实例化,而必须通过一个工厂对象,利用一个factory()方法得到享元对象

     public class FlyweightFactory {
       private Map<Character,Flyweight> files = new HashMap<Character,Flyweight>();
       
       public Flyweight factory(Character state){
           //先从缓存中查找对象
           Flyweight fly = files.get(state);
           if(fly == null){
               //如果对象不存在则创建一个新的Flyweight对象
               fly = new ConcreteFlyweight(state);
               //把这个新的Flyweight对象添加到缓存中
               files.put(state, fly);
           }
           return fly;
       }
    }

    客户端类

    public class Client {

       public static void main(String[] args) {
           // TODO Auto-generated method stub
           FlyweightFactory factory = new FlyweightFactory();
           Flyweight fly = factory.factory(new Character('a'));
           fly.operation("First Call");
           
           fly = factory.factory(new Character('b'));
           fly.operation("Second Call");
           
           fly = factory.factory(new Character('a'));
           fly.operation("Third Call");
       }
    }

    结果:

    该模式比较简单,享元工厂类里面的处理可以解决数据库中的数据问题,例如:我们要获取数据库数据的key 相同,value 不相同(获取value是一个集合),采用此方法可以解决问题,

    复合享元模式:

    对象是不共享的

    个人感觉用的比较少,就不写了。

  • 相关阅读:
    git 命令参考手册 git中文命令参考手册大全
    php常用命令大全
    freemarker中的list 前端模板
    jquery-懒加载技术(简称lazyload)
    JavaScript跨域总结与解决办法 什么是跨域
    Ajax+Spring MVC实现跨域请求(JSONP)JSONP 跨域
    jQuery- v1.10.2 源码解读
    css技巧
    前端异常捕获与上报
    兼容性/pollyfill/shim/渐进增强/优雅降级
  • 原文地址:https://www.cnblogs.com/ljy-skill/p/9019144.html
Copyright © 2011-2022 走看看