结构型---享元模式
// 享元类包含一个树的部分状态。这些成员变量保存的数值对于特定树而言是唯一
// 的。例如,你在这里找不到树的坐标。但这里有很多树木之间所共有的纹理和颜
// 色。由于这些数据的体积通常非常大,所以如果让每棵树都其进行保存的话将耗
// 费大量内存。因此,我们可将纹理、颜色和其他重复数据导出到一个单独的对象
// 中,然后让众多的单个树对象去引用它。
class TreeType is
field name
field color
field texture
constructor TreeType ( name , color , texture ) { ... }
method draw ( canvas , x , y ) is
// 1. 创建特定类型、颜色和纹理的位图。
// 2. 在画布坐标 (X,Y) 处绘制位图。
// 享元工厂决定是否复用已有享元或者创建一个新的对象。
class TreeFactory is
static field treeTypes : collection of tree types
static method getTreeType ( name , color , texture ) is
type = treeTypes . find ( name , color , texture )
if ( type == null )
type = new TreeType ( name , color , texture )
treeTypes . add ( type )
return type
// 情景对象包含树状态的外在部分。程序中可以创建数十亿个此类对象,因为它们
// 体积很小:仅有两个整型坐标和一个引用成员变量。
class Tree is
field x , y
field type : TreeType
constructor Tree ( x , y , type ) { ... }
method draw ( canvas ) is
type . draw ( canvas , this . x , this . y )
// 树( Tree )和森林( Forest )类是享元的客户端。如果不打算继续对树类进行开
// 发,你可以将它们合并。
class Forest is
field trees : collection of Trees
method plantTree ( x , y , name , color , texture ) is
type = TreeFactory . getTreeType ( name , color , texture )
tree = new Tree ( x , y , type )
trees . add ( tree )
method draw ( canvas ) is
foreach ( tree in trees ) do
tree . draw ( canvas )
- 点赞
- 收藏
- 关注作者
评论(0)