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

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

     

  • 相关阅读:
    Maidsafe-去中心化互联网白皮书
    The Top 20 Cybersecurity Startups To Watch In 2021 Based On Crunchbase
    Top 10 Blockchain Security and Smart Contract Audit Companies
    The 20 Best Cybersecurity Startups To Watch In 2020
    Blockchain In Cybersecurity: 11 Startups To Watch In 2019
    004-STM32+BC26丨260Y基本控制篇(阿里云物联网平台)-在阿里云物联网平台上一型一密动态注册设备(Android)
    涂鸦开发-单片机+涂鸦模组开发+OTA
    000-ESP32学习开发-ESP32烧录板使用说明
    03-STM32+Air724UG远程升级篇OTA(阿里云物联网平台)-STM32+Air724UG使用阿里云物联网平台OTA远程更新STM32程序
    03-STM32+Air724UG远程升级篇OTA(自建物联网平台)-STM32+Air724UG实现利用http/https远程更新STM32程序(TCP指令,单片机程序检查更新)
  • 原文地址:https://www.cnblogs.com/luhouxiang/p/2169290.html
Copyright © 2011-2022 走看看