zoukankan      html  css  js  c++  java
  • java设计模式10:Flyweight

    享元模式是对象的结构模式。

    享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State).

    一个内蕴状态是存储在享元对象内部的,并且是不会随环境改变而有所不同的。因此,一个享元可以具有内蕴状态并可以共享。

    一个外蕴状态是可随环境改变而改变的,不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。

    外蕴状态不可以影响享元对象的内蕴状态。换句话说:它们是相互独立的。

    单纯享元模式

       

    复合享元模式

     

    从上面的类图可以看出,在复合享元模式中,享元对象构成合成模式。因此,复合享元模式实际上是单纯享元模式与合成模式的组合。

    在单纯享元模式中,所有的享元模式对象都是可以共享的

    1、抽象享元角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。
    2、具体享元角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享。
    3、享元工厂角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否有一个复合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。
    4、客户端角色:本角色需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。

    示例代码:

    内蕴状态由intrinsicState保存 ,所有的内蕴状态在对象被创建之后,就不可再改变了

    外蕴状态通过operation进行设置,由客户端在需要的时候进行调用,并改变。

    以下的代码中,虽然申请了3个享元对象,但实际上创建的享元对象只有2个,这就是共享的含 义。

    image

    package com.javapatterns.flyweight.simple;

    public class Client
    {
    private static FlyweightFactory factory;

    static public void main(String[] args)
    {
    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");

    factory.checkFlyweight();
    }
    }

     

     

    package com.javapatterns.flyweight.simple;

    import java.util.Map;
    import java.util.HashMap;
    import java.util.Iterator;

    public class FlyweightFactory
    {
    private HashMap flies = new HashMap();

    private Flyweight lnkFlyweight;

    public FlyweightFactory(){}

    public synchronized Flyweight factory(Character state)
    {
    if ( flies.containsKey( state ) )
    {
    return (Flyweight) flies.get( state );
    }
    else
    {
    Flyweight fly = new ConcreteFlyweight( state );
    flies.put( state , fly);
    return fly;
    }
    }

    public void checkFlyweight()
    {
    Flyweight fly ;
    int i = 0;

    System.out.println("\n==========checkFlyweight()=============");
    for ( Iterator it = flies.entrySet().iterator() ; it.hasNext() ; )
    {
    Map.Entry e = (Map.Entry) it.next();
    System.out.println("Item " + (++i) + " : " + e.getKey());
    }
    System.out.println("==========checkFlyweight()=============");
    }

    }

     

     

     





    package com.javapatterns.flyweight.simple;

    public class ConcreteFlyweight extends Flyweight
    {

    private Character intrinsicState = null;

    public ConcreteFlyweight(Character state)
    {
    this.intrinsicState = state;
    }

    public void operation(String state)
    {
    System.out.print( "\nIntrinsic State = " + intrinsicState +
    ", Extrinsic State = " + state);
    }
    }

     

     




    package com.javapatterns.flyweight.simple;

    abstract public class Flyweight
    {
    abstract public void operation(String state);
    }

     

     

     

    复合享元模式:

    image

    从图上理解是比较容易的,但书中的代码着实让人晕的很,索性先跳过。
     

     

  • 相关阅读:
    ionic localstorage
    angular 中文鏈接
    把jqmobi 變成jQuery 的插件 從此使用jQuery
    jqmobi 的一些設置
    ionic ngcordova map 地圖
    ionic pull to refresh 下拉更新頁面
    json 對象的序列化
    鍵盤彈出,頁面佈局被推上去了.....
    Cordova V3.0.0中config.xml配置文件的iOS Configuration
    android ios 只能輸入數字 不能輸入小數點的 函數 cordova
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/2169290.html
Copyright © 2011-2022 走看看