游戏编程模式-享元模式,池类技术,原型模式
享元模式与池类技术
享元模式(Flyweight Pattern): 运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。
当我们需要重复使用一个对象的时候,如果重复创建对象,会让内存消耗越来越大。能不能创建了第一次之后,如果需要再次使用,再直接使用之前已经创建的对象呢。让一个对象可以共享,享元模式就是实现这样的功能。
同样的对象池、连接池(比如数据库连接池)、线程池等也是为了复用,但其与享元模式的复用有区别的。
池化技术中的“复用”可以理解为“重复使用”,主要目的是节省时间(比如从对象池中取一个对象,不需要重新创建)。在任意时刻,每一个对象、连接、线程,并不会被多处使用,而是被一个使用者独占,当使用完成之后,放回到池中,再由其他使用者重复利用。享元模式中的“复用”可以理解为“共享使用”,在整个生命周期中,都是被所有使用者共享的,主要目的是节省空间。学到这里时,私以为其实并没有很大的区别,举一个例子说明,一行人前往租车,五个人只需要取出一辆车即可,五次获取一辆车的请求实际上都是同一辆车,即可视为五人分享了这一辆车,如果采取对象池的话,五人应该取得五辆车。这里存在一点疑惑,有待日后更加深入的学习后来更改。
C#实现简单享元模式和对象池
对象池
享元模式通常由三部分组成,抽象享元角色,具体享元角色,享元工厂。

原型模式
原型模式用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式与享元模式的区别是原型模式侧重于”创建“,我们通过拷贝确确实实的创建了新的实例,它属于创建型设计模式;而享元模式侧重于“重用”,即如果有现有的实例就不去创建了,直接拿来用就行了。
原型模式也可以简单理解为:深拷贝和浅拷贝。
浅拷贝:将对象中所有得字段复制到新得对象(副本)中,其中,值类型的字段的值被复制到副本中后,在副本中修改不会影响到源对象的值,而引用类型的字段被复制到副本中的是引用类型的引用,而不是引用的对象,在副本中对引用类型的修改会影响源对象本身。对于浅拷贝(浅克隆)一般我们用Object.MemberwiseClone方法
深拷贝:同样的是将所有字段复制到新的对象当中,不过,无论作为对象的值类型,还是引用类型,都会被重新创建和赋值,对于副本的修改,不会影响到对象的本身。深拷贝(深克隆)一般采用序列化的方式进行拷贝
在C#中,如果你要实现浅拷贝或者深拷贝,微软都建议使用类型继承接口ICloneable接口的方式明确告诉调用者,该类型可以被拷贝。
什么样的情况下才会需要应用原型模式呢,假设我们需要制作一个史莱姆怪物,他的技能是分裂自己,并且完全复制分裂时的状态。那么史莱姆工厂这时候就无法满足产出这样一个特殊的史莱姆,当然我们也可以通过记录分裂时的各项参数来生产相同的史莱姆,但是我们采用更简单的办法,让史莱姆作为原型,在分裂的时候克隆自己,这样简单的实现这个效果。
代码懒得写了,网上扒一个当例子

