享元模式(Flyweight)

目录

前言:

1、什么是享元模式 ?

2、享元模式的优势劣势

2.1、有什么优点?

2.1.1、 减少内存占用

2.1.2、 提升性能

2.1.3、 增强可维护性

2.2、有什么缺点?

2.3、什么时候使用呢?

代码展示

总结


前言:

在软件开发中,内存和性能优化一直是开发人员关注的重要问题。在处理大量相似对象时,如果能够合理地共享对象以减少内存开销,同时提升系统性能,那将是一个重要的解决方案。享元模式(Flyweight Pattern)为我们提供了一种有效的方法来实现对象的共享和重用。

1、什么是享元模式 ?

享元模式是一种结构型设计模式,它旨在通过共享相似对象的部分状态来减少内存使用和对象创建的开销。这种模式适用于大量具有相似属性的对象,将这些相似属性提取为共享的状态,以减少重复创建对象的成本。

运用共享技术有效地支持大量细粒度的对象。

我觉得它很像我们平常说的容器,只不过这个容器是用哈希表来存储的数据,通过键值对的形式,先把key和value值添加到哈希表里面,放入这个享元池里面,客户端通过提供的key值来获取value对象。这样的好处是什么呢?在享元池里面的key值不会重复,相同key值和value值的对象只会实例化一次,这样的话就不会产生重复的对象,避免资源的浪费。

享元模式(Flyweight)_第1张图片

2、享元模式的优势劣势

2.1、有什么优点?

2.1.1、 减少内存占用

享元模式通过共享状态,将多个相似对象的相同部分合并到一个共享对象中。这样就可以避免重复存储相同的数据,从而减少了内存的占用。

2.1.2、 提升性能

由于减少了对象的创建和销毁,系统的性能得到了提升。特别是在需要大量相似对象时,通过共享减少了对象的创建开销,提高了系统的响应速度。

2.1.3、 增强可维护性

享元模式将共享状态集中管理,使得对相同状态的修改更加集中和容易。这有助于维护代码的一致性和可维护性。

2.2、有什么缺点?

使得系统更加复杂,为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

2.3、什么时候使用呢?

一个应用程序使用了大量的对象;

这些对象大多数可以外部状态时。


代码展示

场景:小菜其他私营业主做网站,需要做多个网站,但要求不太一样,有的人希望是新闻发布形式的,有人希望是博客形式的,也有还是原来的产品图片加说明形式的,而且他们都希望在费用上能大大降低。可是每个网站租用一个空间,费用上减低是不太可能的。怎么办呢?我们就可以使用享元模式。

①、享元模式

Flyweight类

abstract class Flyweight           //抽象类
{
    public abstract void Operation(int extrinsicstate);   //抽象方法
}

ConcreteFlyweight类

class ConcreteFlyweight : Flyweight            //具体享元
    {
        public ConcreteFlyweight() { }        //创建此类无参构造方法

        public override void Operation(int extrinsicstate)  //重写Operation方法,并接收外部传来的参数
        {
            Console.WriteLine("具体Flyweight:" + extrinsicstate);   //在控制台输出结果
        }
}

UnsharedConcreteFlyweight类

class UnsharedConcreteFlyweight : Flyweight    //不需要共享的Fleweight子类
{
    public override void Operation(int extrinsicstate)   //重写抽象方法,并接受外部传来的参数
    {
        Console.WriteLine("不共享的具体Flyweight:" + extrinsicstate);  //在控制台输出结果
    }
}

FlyweightFactory类

class FlyweightFactory
{
        private Hashtable flyweights = new Hashtable();    //创建一个哈希表
        public FlyweightFactory()                          //创建此类的构造方法
        {
            //初始化工厂时,先生成三个实例
            flyweights.Add("X", new ConcreteFlyweight());  //往哈希表添加一个键值对X
            flyweights.Add("Y", new ConcreteFlyweight());  //往哈希表添加一个键值对Y  
            flyweights.Add("Z", new ConcreteFlyweight());  //往哈希表添加一个键值对Z
        }

        public Flyweight Getflyweight(string key)
        {
            return ((Flyweight)flyweights[key]);     //根据客户端请求,获得已生成的实例
        }
}

客户端类

int extrinsicstate = 22;    //外部代码状态

FlyweightFactory f = new FlyweightFactory();   //实例化享元工厂

Flyweight fx = f.Getflyweight("X");   //创建一个网站fx对象,调用享元工厂的Getflyweight方法,将值赋给fx对象
fx.Operation(--extrinsicstate);       //调用网站的Operation对象,extrinsicstate-1

Flyweight fy = f.Getflyweight("Y");   //创建一个网站fy对象,调用享元工厂的Getflyweight方法,将值赋给fy对象
fy.Operation(--extrinsicstate);       //调用网站的Operation对象,extrinsicstate-1

Flyweight fz = f.Getflyweight("Z");   //创建一个网站fz对象,调用享元工厂的Getflyweight方法,将值赋给fz对象
fz.Operation(--extrinsicstate);       //调用网站的Operation对象,extrinsicstate-1

Flyweight uf = new UnsharedConcreteFlyweight();   //创建一个不共享的flyweight子类
uf.Operation(--extrinsicstate);      //调用网站的Operation对象,extrinsicstate-1

Console.ReadKey();

享元模式(Flyweight)_第2张图片

总结

享元模式是一种强大的设计模式,通过共享相似对象的部分状态来优化内存占用和性能。它适用于需要大量相似对象的情况,通过共享共同状态,有效地减少了对象的创建成本。通过理解和应用享元模式,我们可以在处理大规模对象时提升系统的性能和可维护性,优化软件开发过程。

你可能感兴趣的:(设计模式,享元模式,java,开发语言)