python 享元模式_大话设计模式之享元模式

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

也就是说,享元模式执行时所需要的状态是有内部的,也可能有外部的,内部状态存储于对于享元对象的具体类中,而外部对象则应该考虑有客户端对象存储或者计算,当调用享元对象操作时,将该状态传递给它。

如果在一个应用程序中使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用这个模式。还有就是对象的大多说状态可以是外部,如果删除对象的外部状态,那么可以用相对较少的享元对象取代很多组的对象,此时可以考虑使用享元模式。比如在休闲游戏开发中,像围棋、五子棋、跳棋等,他们都有大量的棋子对象,像围棋和五子棋只有黑白两色,跳棋颜色略多一些,不过数量也可以接受,所以颜色应该是棋子的内状态,而各个棋子之间的差别主要在于位置的不同,所谓方位应该起棋子的外部状态。

下图是享元模式的结构图:定义享元模式的内部抽象类,通过这个接口,享元类可以接受并作用于外部状态,(ps, python 的容器性存储决定我们可以不需要这个类,不过为了清晰而列出来。)

2. 具体享元类,它继承与享元类而实现其接口,并为内部状态增加存储空间:

3. 不需要共享的享元子类,这样它才能使flyweight接口共享成为可能,但它并不是强制共享。

4. flyweightfactory,是一个享元工厂,用来创建并管理flyweight对象,它主要是用来确保合理的共享flyweight,当用户请求一个flyweight时,flyweightfactory对象提供一个已创建的实例或者创建一个。

这个模式主要体现在factory_flyweight工厂类的函数 get_fly_weight,它首先判断在工厂中使用有共享的单元,如果有的就直接返回这个实例;如果没有的话,就创建一个需求的实例并返回。

5. 客户端的代码如示:

使用for循环产生10个实例,在客户程序中实现外部的变化,如command每次减去3,依据需要得到的type不同,仅仅需要实例化3次享元的实例。

运行的结果如示:

可以看出,对于享元具体类在工厂中仅仅例化了3个,而外部类有10个。

最后是书中介绍的做一个使用享元模式的例子,当然也是非常的简单,具体也就不再解释了,仅供娱乐liao~

运行的结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值