首页 > 编程知识 正文

共享文件夹设置只读模式,共享的文件只能只读不能修改

时间:2023-05-06 07:58:06 阅读:167593 作者:38

享受元模式:实例数量庞大的类为变化部分和不变部分定义:使用共享对象可有效的支持大量的细粒度的对象。

享元模式是池技术的重要实现方式,分配太多的对象到应用程序中会有损程序的性能,还容易造成内存溢出,使用享元模式的思想,细分数据对象,划分数据的内部状态和外部状态,减少创建数据对象的重复数据部分带来的内存损耗。

翻译:

1、程序由数据和算法组成,算法在数量上是固定的,但数据在数量上没有上限

2、如果数据量非常大(如双十一电商购物数据量),如果将数据类全部制作好,服务器将无法正常运行。

3、为了不做太多的数据类,需要把数据结构中不变化的部分分离为内部状态,把变化的部分分离为外部状态和内部状态,用尽可能简单的数据结构表示它们,把内部状态作为外部状态的附加信息共享。

4、在外部条件有限的情况下,使用工厂模式维护一个数据池,可以实现相同外部条件的数据类复用,不需要为每个数据类创建实例。

内部状态:

对象可以共享的信息存储在共享源对象内部,不受环境的影响。

例如:

考试成绩单上的ABC分数、优秀、良好、普通等注释

外部状态:

对象可以依赖的标记会随环境而变化,并且不会被共享。

例如:

试卷的分数

类图摘自设计模式之禅:

享受元模式的几个作用:

1、抽象享受方角色(Flyweight )是数据的抽象类,是同时定义对象外部状态和内部状态的接口或实现。

2、具体享受方角色ConcreteFlyweight :实现具体产品类、抽象角色定义的业务。 在这个作用中需要注意内部状态的处理与环境无关,不应该在一个操作中改变外部状态或内部状态。

3、不可共享的共享元角色unsharedConcreteFlyweight:没有外部状态或不能使用共享技术进行线程安全的对象通常不会出现在共享元工厂中。

4、享元工厂的FlyweightFactory:提供了一种构建和维护单个池容器以从池中获取对象的方法。

享受元模型的目的是活用共享技术,可以共享细粒度的对象,容易复用和重构,防止在再进程中生成过多的类。

例如,全国的父母要想在网上调查孩子们的高考成绩,就需要通过共享来避免把所有的试卷发到new上。 否则,服务器将无法承受,即使居住也将造成大量资源浪费,影响其他进程的正常运行。

工厂类中维护一个静态池保存已有的类型,使用现有的stl容器充当池非常合适,本例中使用了vector维护三个考试成绩的等级,outstanding,good,common。

工程池中外部状态的有限使池的大小有限,也就确定了数据类的数量是有限的,不会因需求或调用者的无限增长而增长,使用数据累的共享重用有效避免了创建大量类给进程带来的压力。

元模式的优点:

大幅减少进程创建的对象,减少程序内存消耗,提高程序性能。

坏处:

外部状态很难固化、改变,如果修改不当,可能会导致系统逻辑混乱。

使用场景:

系统中存在许多类似对象。

细粒度的对象都具备比较接近的外部状态,而且内部状态与环境无关,对象没有特定的身份。

需要缓冲池的地方。

问题所在:享元对象数量太少导致的线程不安全,只有通过经验在享元池中一开始就给到足够满足业务要求的享元对象,才能减少线程不安全带来的麻烦,或者干脆从设计上避免出现并发的写操作。

代码示例:通过成绩查看考试结果,并有普通工厂模式和享元模式的区别展示

//交换模式、细粒度对象数,如果是高并发,则减少同时存在于内存中的对象数。

//工厂模式对象池="享元模式

//对象池中的对象只能是只读的,而对象池解决的也是只读时对象的对象过多问题

//享元模式在写作情况下线程不安全,解决方案是避免人工写作的情况

例如,以下示例根据成绩生成特定的成绩单

//包括工厂模式与享元模式的比较与分析

类别等级{ public :等级(; void show (; 受保护: stringm _ strstudyreport; (; 等级:等级() {cout的成绩单为) endl; }void GradeLevel:show () {cout m_strStudyReport endl; } class outstanding 3360 public grade level { publ }

ic:OutStanding();};OutStanding::OutStanding(){m_strStudyReport = (string)"这个学生的排名为 杰出!这个学生在学校里的表现十分杰出,是学校的明星学生,以后一定要大力培养;";}class Good :public GradeLevel{public:Good();};Good::Good(){m_strStudyReport = (string)"这个学生的排名为 优秀!这个学生成绩优异,发挥稳定,老师们对他颇有赞誉;";}class Common :public GradeLevel{public:Common();};Common::Common(){m_strStudyReport = (string)"这个学生的排名为 一般!这个学生天资聪慧,只要刻苦发奋,一定会有所进步;";}//一般的工厂模式class GradeReportFactory{public:GradeLevel* GetReportByGrade(int Grade);protected:GradeLevel* GetOutStanding();GradeLevel* GetGood();GradeLevel* GetCommom();};GradeLevel* GradeReportFactory::GetReportByGrade(int Grade){if (Grade >= 90){return GetOutStanding();}else if (Grade >= 60){return GetGood();}else{return GetCommom();}}GradeLevel* GradeReportFactory::GetOutStanding(){return (new OutStanding());}GradeLevel* GradeReportFactory::GetGood(){return (new Good());}GradeLevel* GradeReportFactory::GetCommom(){return (new Common());}//享元模式下的工厂class GradeReportFactoryPlus{public:GradeReportFactoryPlus();GradeLevel* GetReportByGrade(int Grade);protected:GradeLevel* GetOutStanding();GradeLevel* GetGood();GradeLevel* GetCommom();vector<GradeLevel*> m_vecGradeLevelBuffer;};GradeReportFactoryPlus::GradeReportFactoryPlus(){m_vecGradeLevelBuffer.push_back(new OutStanding());m_vecGradeLevelBuffer.push_back(new Good());m_vecGradeLevelBuffer.push_back(new Common());}GradeLevel* GradeReportFactoryPlus::GetReportByGrade(int Grade){if (Grade >= 90){return GetOutStanding();}else if (Grade >= 60){return GetGood();}else{return GetCommom();}}GradeLevel* GradeReportFactoryPlus::GetOutStanding(){return m_vecGradeLevelBuffer[0];}GradeLevel* GradeReportFactoryPlus::GetGood(){return m_vecGradeLevelBuffer[1];}GradeLevel* GradeReportFactoryPlus::GetCommom(){return m_vecGradeLevelBuffer[2];}void func(){GradeReportFactory reportFac;for (int i = 0; i < 100; ++i){reportFac.GetReportByGrade(i)->show();}}void func2(){GradeReportFactoryPlus reportFac;for (int i = 0; i < 100; ++i){reportFac.GetReportByGrade(i)->show();}}

普通工厂模式中,需要一份成绩单便new构造一份,导致生成了太多成绩单对象:

享元模式中,使用数据池维护了所有3种类型的成绩单,将生成数量控制在3个,但同样满足了大量查看成绩单的需求。

同样,代码中并没有写delete释放指针的语句,但不代表delete不重要,在自己编写代码的时候,需要注意,既然有new,就必须有delete,配合使用。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。