设计模式之享元模式

一.享元模式的简介

享元模式(FlyWeight Pattern)运用共享技术有效地支持大量细粒度的对象,该模式属于结构型模式。

享元模式的核心思路:通过重用现有对象,减少对象数量的方式,优化应用所需的对象结构的方式

二.享元模式的设计类图

这里写图片描述
(图片加载慢,多刷新几下,耐心等待……)

注:享元工厂类(FlyWeightFactory)和享元抽象类(FlyWeight),二者是聚合关系。

聚合关系:享元工厂类(FlyWeightFactory)包含享元抽象类(FlyWeight),但享元抽象类(FlyWeight)不是享元工厂类(FlyWeightFactory)的一部分。

三.享元模式的代码及讲解

1.抽象享元类(FlyWeight)

设计分析: 抽象享元类所有具体享元类的父类,提供一个可以接收并作用于外部的状态。

/**
 * 享元类的父类
 */
abstract class FlyWeight {
    // 抽象的操作方法
    public abstract void operation(int state);
}
2.具体享元实现类(ConcreteFlyWeight)

设计分析: 具体的享元类,继承FlyWeight并实现接口,并为内部空间增加存储状态。

class ConcreteFlyWeight extends FlyWeight {
    @Override
    public void operation(int state) {
        System.out.println("具体的FlyWeight对象:" + state);
    }
}
3.不需要共享FlyWeight子类(UnSharedConcreteFlyWeight)

设计分析: 有些对象不需要共享,则可在此实现。

class UnSharedConcreteFlyWeight extends FlyWeight {
    @Override
    public void operation(int state) {
        System.out.println("不需要共享的具体的FlyWeight对象:" + state);
    }
}
4.享元工厂类(FlyWeightFactory)

设计分析: 用来创建并管理FlyWeight对象,确保合理的共享FlyWeight,FlyWeightFactory为用户提供一个自己已经创建好的享元对象。

class FlyWeightFactory {
    // 需要用HashMap存储这些对象
    private HashMap<String, FlyWeight> flyWeights = new HashMap<String, FlyWeight>();

    /**
     * 享元工厂构造器 :在初始化工厂的时候,将具体享元对象创建好
     */
    public FlyWeightFactory() {
        super();
        flyWeights.put("A", new ConcreteFlyWeight());
        flyWeights.put("B", new ConcreteFlyWeight());
        flyWeights.put("C", new ConcreteFlyWeight());
    }

    // 根据key获取享元对象
    public FlyWeight getFlyWeight(String key) {
        return flyWeights.get(key);
    }
}
5.客户端(Client)中用法:

设计分析:在客户端中,通过享元工厂创建享元对象,通过普通方式创建不需要共享的对象 。

代码如下:

public class Client {
    public static void main(String[] args) {
        int state = 20;
        FlyWeightFactory factory = new FlyWeightFactory();
        FlyWeight flyWeightA = factory.getFlyWeight("A");
        flyWeightA.operation(state--);

        FlyWeight flyWeightB = factory.getFlyWeight("B");
        flyWeightB.operation(state--);

        FlyWeight flyWeightC = factory.getFlyWeight("C");
        flyWeightC.operation(state--);

        UnSharedConcreteFlyWeight unSharedFlyWeight = new UnSharedConcreteFlyWeight();
        unSharedFlyWeight.operation(state--);
    }
}
6.运行结果

结果分析: 享元对象的创建后,并作用于外部对象。

具体的FlyWeight对象:20
具体的FlyWeight对象:19
具体的FlyWeight对象:18
不需要共享的具体的FlyWeight对象:17
7.源码下载

本文示例代码下载地址:点击下载

三.总结:

当程序中有大量对象时,有可能会造成内存溢出,可以把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,从而避免重新创建,浪费内存空间。基于这种理念,享元模式应运而生。

享元模式减少创建对象的数量,以减少内存占用和提高性能。

1.享元模式的优点
  • 减少对象的创建,降低系统的运行内存,提高了内存的使用效率。
2.享元模式的缺点
  • 提高了系统的复杂度,需要分离出外部状态和内部状态,否则强行共享,可能会引起线程安全问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值