享元模式

本文深入探讨了享元模式的概念及其应用场景,介绍了享元模式的基本结构包括Flyweight类、ConcreteFlyweight类、UnsharedConcreteFlyweight类及FlyweightFactory类。通过示例说明了如何通过享元模式减少内存中的实例数量,从而降低存储开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:细粒度、粗粒度
在项目中,粗细是相对的,粗粒度相当于抽象方法,只有一个轮廓,而没有具体的实现;细粒度是实现了某个抽象方法,有具体的操作。(只是结合面向对象开发的一个理解)

2:享元模式(Flyweight):运用共享技术有效的支持大量细粒度的对象。
(之所以说细粒度的,是因为每个实例都对细节有不同的实现,比如人吃饭,每个人每天都有这个动作,但吃的什么是不同的)

3:享元模式结构图
这里写图片描述
Flyweight类:它是所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。
ConcreteFlyweight是集成Flyweight超类或实现Flyweight接口,并未内部状态增加存储空间。
UnsharedConcereteFlyweight是指那些不需要共享的Flyweight子类,因为Flyweight接口共享成为可能,但它不强制共享。
FlyweightFactory是一个享元工厂,用来创建并管理Flyweight对象,它主要是用来确保合理的共享Flyweight,用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话,这种方式是保证创建的实例是只有一个)。

4:内部状态与外部状态
在享元对象内部并且不会随着环境改变而改变的共享部分,成为享元对象的内部状态,而随着环境改变而改变的、不可以共享的状态就是外部状态。

享元模式可以避免大量非常类似的开销,在程序设计中,有时需要生成大量细粒度的类实例来表示数据,如果能发现这些事例除了几个参数其他基本都是相同的,有时就能够接受大幅度的减少需要实例化的类的数量。如果能把那些参数移到实例的外面,在方法调用的时候将他们传递进来,就可以通过共享大幅度的减少单个实例的数目。

外部状态具体值得确认由客户端操作。

5:享元模式实现

//抽象的字符类
public abstract class Charactor{
    //属性
    protected char letter;
    protected int fontsize;
    //显示方法
public abstract void display();
//设置字体大小
public abstract void setFontSize(int fontsize);
}
//具体的字符类A
public class CharactorA extends Charactor{
    //构造函数
    public CharactorA(){
        this.letter = 'A';
        this.fontsize = 12;
    }
    //显示方法
    public void display(){
    try{
        System.out.println(this.letter);
    }catch(Exception err){
    }
}
//设置字体大小
public void setFontSize(int fontsize){
    this.fontsize = fontsize;
}
}
//具体的字符类B
public class CharactorB extends Charactor{
    //构造函数
    public CharactorB(){
        this.letter = 'B';
        this.fontsize = 12;
    }
    //显示方法
    public void display(){
    try{
        System.out.println(this.letter);
    }catch(Exception err){
    }
}
//设置字体大小
public void setFontSize(int fontsize){
    this.fontsize = fontsize;
}
}
//客户程序
public class ClinetTest{
public static void main(String[] args){
Charactor a = new CharactorA();
Charactor b = new CharactorB();
//设置字符A的大小
a.setFontSize(12);
        //显示字符B
        a.display();
//设置字符B的大小
b.setFontSize(14);
        //显示字符B
b.display();
    }
}

6:享元模式使用场景
(1)如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用
(2)对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以使用。

7:享元模式优缺点:
(1)优点
极大的减少了内存中实例的存在,解决了对象的开销问题
(2)缺点
享元模式使用外部状态,使程序的逻辑复杂化

8:享元模式总结
(1)享元模式核心在于享元对象的内部状态(共有属性或方法)和享元工厂(确保使用一个实例)。
(2)享元模式可以减少内存的对象实例,但也有其它不足,使用时要根据实际情况决定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值