嵌入式c语言技术实战开发 pdf,嵌入式c语言程序设计
关于设计模式的更多信息,请参考设计模式的模式概述(模式概要)(C实现)。
文章的目的是解决问题,实现概述,指出,应用场景,在生活场景的软件中使用场景,有利有弊,使用模式结构和角色类图的例子,githubunshared oncreteflyweight(非共享具体享受源类)
介绍
顾名思义,“香苑”就是合租单位。享受元模式的意图是重用对象和节省内存。如果享受元对象是不可变对象。
不可变对象意味着构造函数初始化后,其状态(对象的成员变量或属性)不会改变。
意图:享元模式(Flyweight Pattern):利用共享技术有效支持大量细粒度对象的重用。虽然系统只使用了少量的对象,但是这些对象非常相似,状态变化很小,可以多次重用。共享元模式也叫轻量级模式,是一种对象结构模式,因为可以共享的对象必须是细粒度的对象。
解决方法:如果有大量的对象,可能会导致内存溢出。对通用部分进行抽象,如果有相同的业务需求,可以直接返回内存中已经存在的对象,避免重新制作。
概述:工厂模型允许工厂类通过在地图中缓存创建的共享对象来实现重用。
重要:在Map中存储对象可以有效地支持共享模式下大量细粒度对象的重用。分享对象的关键是区分010和59000。
内部状态(Intrinsic State)和外部状态(Extrinsic State)
内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,内部状态可以共享共享源对象的外部状态通常保存在客户端,共享源对象创建后,根据需要转移到共享源对象内部。
应用场景:如果系统中有多个重复对象,并且这些重复对象是不可变对象,那么可以使用共享元模式将对象设计为共享源,在内存中只保留多个代码引用的一个实例。
不仅对于同一对象,对于相似的对象,我们也可以从中提取出相同的部分(场),让它们的许多相似对象参考自己的享受来源,设计不同的地方作为外在状态传递给对象。
使用共享元模式时,必须维护用于存储共享元对象的共享元池。这需要系统资源,因此只有当共享元对象需要多次重用时,才值得使用共享元模式。
像棋子一样活着的棋子,除了棋子之间的颜色和位置,似乎没有什么区别!也就是说,几乎每个棋子对象的所有状态都是一样的(形状、材质、质量等。).
在中创建一串场景JAVA。返回字符串(如果有),否则创建字符串并将其保存在字符串缓存池中。
在Python[CPYTHON(Python的C实现)]中,数组被保存为-5到256之间的整数,并被用作缓存。
优点:共享元模型是通过共享元池内存创建的共享元对象。外部状态是随环境改变而改变的、不可以共享的状态共享元模型由于内部状态和外部状态的不同而独立于外部状态,所以客户端可以根据需要使用它。缺点:要享受元模式,就必须增加分离内部状态和外部状态的逻辑,增加编程复杂度。模式函数实现相同或相似的细粒度对象的复用,大大减少了系统中的对象数量,节约了内存空间,提升了系统性能:通常是接口或抽象类,抽象共享元素Flyweight(抽象享元类):实现抽象享受类声明的方法,其实例称为享受源对象;具体的元类为内部状态提供存储空间。http://www.Sina.com/http://www.Sina.com/:抽象共享元类的所有子类不需要共享。这些类可以被设计成不共享特定的共享元类。如果您需要一个不共享特定共享元类的对象,您可以通过实例化直接创建该对象。ConcreteFlyweight(具体享元类):用于创建和管理共享元对象。抽象元类编程将各种具体的共享元类对象存储在一个共享元类池中。共享元池通常被设计用来存储一组键值对(或其他类型的集合),并且是结合工厂模型设计的。如果客户需要共享元对象,如果该对象的实例已经存在于共享元池中,则将返回该实例。否则,创建一个新实例,将新实例返回给客户,并将新实例保存到共享元池。类图
代码以围棋棋子为例,但棋子除了颜色和坐标都一样。
Flyweight(抽象享受源类):ChessPiece
混凝土轻量级:黑棋白棋
斯皮策
UnsharedConcreteFlyweight(非共享混凝土共享类):坐标
飞重工厂:切斯比拉工厂
GitHub FlyweightPattern
UnsharedConcreteFlyweight(非共享具体享元类)///UnsharedConcreteFlyweight(非共享具体享元类):Coordinatesclass坐标{public: Coordinates(int x,int y){ this-x=x;this-y=y; std:cout 坐标你好,x= x y= y STD:endl;} ~ Coordinates(){ STD:cout Coordinates Bye,x= x y= y STD:endl;} int getX(){ return x;} void setX(int x){ this-x=x;} int getY(){ return y;} void setY(int y){ this-y=y;} private:int x;int y;};轻量级(抽象享元类)///轻量级(抽象享元类):chespieclass chespice { public:virtual ~ chespice()=default;虚拟STD:string getColor()=0;空显示(坐标*坐标){ std:cout 棋子颜色: getColor(),棋子位置: x= coord-getX(),y= coord-getY()STD:endl;};protected:chespice()=default;标准:字符串颜色;};混凝土轻量级(具体享元类)///混凝土重量(具体享元类):blackchespice whitechespieclass blackchespice:public chespice { public:blackchespice(){ STD:cout blackchespice Hello STD:endl;color=黑色;} ~ BlackChessPiece()重写{ STD:cout blackchespice Bye STD:endl;} STD:string getColor()override { return color;}};class whitechespice:public chespice { public:whitechespice(){ STD:cout whitechespice Hello STD:endl;color=白色;} ~ WhiteChessPiece()重写{ STD:cout whitechespice Bye STD:endl;} STD:string getColor()override { return color;}};FlyweightFactory(享元工厂类)///FlyweightFactory(享元工厂类):chespicefactoryclass chespicefactory { public:static chespicefactory * getInstance(){ static chespicefactory实例;返回实例;} chespice * getchespice(const STD:string color){ return mapchespice[color];} private:chespicefactory(){ STD:cout chespicefactory Hello STD:endl;mapchespice。insert(STD:pair STD:string,chespice *(b ,new blackchespice()));mapchespice。insert(STD:pair STD:string,chespice *( w ,new white chespice());} ~ chespicefactory(){ STD:cout chespicefactory Bye STD:endl;自动ITER=mapchespice。begin();while(iter!=mapchespice。end()){ chespice * chespice=ITER-秒;删除chespice ITER } } STD:map STD:string,chespice * mapchespice };测试int main(){ chespice * black 1,*black2,*black3,*white1,* white2ChessPieceFactory *工厂;//获取享元工厂对象factory=chespicefactory:getInstance();//通过享元工厂获取三颗黑子black 1=factory-getchespice( b );black 2=factory-getchespice( b );black 3=factory-getchespice( b ); std:cout 两颗黑子是否相同:(black 1==black 2)STD:endl;//通过享元工厂获取两颗清脆的花瓣白色1=factory-getchespice( w );white 2=factory-getchespice( w ); std:cout 两颗清脆的花瓣是否相同:(white 1==white 2)STD:endl;std:矢量坐标*坐标;//STD:func Coordinates *(Coordinates *)func=[Coordinates](Coordinates * coord){ auto func=[Coordinates](Coordinates * coord){ Coordinates。push _ back(坐标);返回坐标;};//显示棋子黑色1-显示(功能(新坐标(1,3)));黑色2-显示屏(功能(新坐标(2,6)));黑色3-显示(func(新坐标(4,7)));白色1-显示(func(新坐标(5,8)));白色2-显示(功能(新坐标(4,1)));对于(自动坐标:坐标){删除坐标;}返回0;} 输出
我的能力有限。如有错误或其他建议,请告知,欢迎讨论。谢谢大家!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。