设计模式 结构型模式 -- 享元模式(定义 示例 优缺点分析 使用场景)

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 结构型模式 -- 享元模式(定义 示例 优缺点分析 使用场景)相关的知识,希望对你有一定的参考价值。

1. 享元模式


1.1 享元模式概述

动机:

字符享元对象示意图:

分析:


原理:


1.2 享元模式定义


1.3 享元模式结构

角色:

功能:


1.3.1 典型的抽象享元类代码


1.3.2 典型的具体享元类代码


1.3.3 典型的非共享具体享元类代码


1.3.4 典型的享元工厂类代码


1.4【例】俄罗斯方块

下面的图片是众所周知的俄罗斯方块中的一个个方块,如果在俄罗斯方块这个游戏中,每个不同的方块都是一个实例对象,这些对象就要占用很多的内存空间,下面利用享元模式进行实现。

先来看类图:

AbstractBox :

package com.tian.flyweight;

/**
 * @version v1.0
 * @ClassName: AbstractBox
 * @Description: 抽象享元角色
 */
public abstract class AbstractBox {

    //获取图形的方法
    public abstract String getShape();

    //显示图形及颜色
    public void display(String color) {
        System.out.println("方块形状:" + getShape() + ", 颜色:" + color);
    }
}

IBox:

package com.tian.flyweight;

/**
 * @version v1.0
 * @ClassName: IBox
 * @Description: I图形类(具体享元角色)
 */
public class IBox extends AbstractBox {
    public String getShape() {
        return "I";
    }
}

LBox :

package com.tian.flyweight;

/**
 * @version v1.0
 * @ClassName: IBox
 * @Description: L图形类(具体享元角色)
 */
public class LBox extends AbstractBox {
    public String getShape() {
        return "L";
    }
}

OBox:

package com.tian.flyweight;

/**
 * @version v1.0
 * @ClassName: IBox
 * @Description: O图形类(具体享元角色)
 */
public class OBox extends AbstractBox {
    public String getShape() {
        return "O";
    }
}

BoxFactory:

package com.tian.flyweight;

import java.util.HashMap;

/**
 * @version v1.0
 * @ClassName: BoxFactory
 * @Description: 享元工厂类:将该类设计为单例
 */
public class BoxFactory {

    private HashMap<String, AbstractBox> map;

    //在构造方法中进行初始化操作
    private BoxFactory() {
        map = new HashMap<String, AbstractBox>();
        map.put("I", new IBox());
        map.put("L", new LBox());
        map.put("O", new OBox());
    }

    //提供一个方法获取该工厂类对象
    public static BoxFactory getInstance() {
        return factory;
    }

    private static BoxFactory factory = new BoxFactory();

    //根据名称获取图形对象
    public AbstractBox getShape(String name) {
        return map.get(name);
    }
}

Client :

package com.tian.flyweight;

/**
 * @version v1.0
 * @ClassName: Client
 * @Description: 客户端类:测试类
 */
public class Client {
    public static void main(String[] args) {
        //获取I图形对象
        AbstractBox box1 = BoxFactory.getInstance().getShape("I");
        box1.display("灰色");

        //获取L图形对象
        AbstractBox box2 = BoxFactory.getInstance().getShape("L");
        box2.display("绿色");

        //获取O图形对象
        AbstractBox box3 = BoxFactory.getInstance().getShape("O");
        box3.display("灰色");

        //获取O图形对象
        AbstractBox box4 = BoxFactory.getInstance().getShape("O");
        box4.display("红色");

        System.out.println("两次获取到的O图形对象是否是同一个对象:" + (box3 == box4));
    }
}

1.4.1 运行结果:


1.5 优缺点和使用场景


1.5.1 优点

  • 极大减少内存中相似或相同对象数量,节约系统资源,提供系统性能
  • 享元模式中的外部状态相对独立,且不影响内部状态

1.5.2 缺点

为了使对象可以共享,需要将享元对象的部分状态外部化,分离内部状态和外部状态,使程序逻辑复杂


1.5.3 使用场景

  • 一个系统有大量相同或者相似的对象,造成内存的大量耗费。
  • 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
  • 在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应当在需要多次重复使用享元对象时才值得使用享元模式。


以上是关于设计模式 结构型模式 -- 享元模式(定义 示例 优缺点分析 使用场景)的主要内容,如果未能解决你的问题,请参考以下文章

Python 设计模式 — 结构型模式 — 享元模式

Python 设计模式 — 结构型模式 — 享元模式

设计模式之享元模式(结构型)

结构型模式—享元模式

Flyweight享元模式(结构型模式)

结构型模式之享元模式