1. 程式人生 > >設計模式,享元模式(7)

設計模式,享元模式(7)

turn actually 一個 享元模式 rom imp import pat 兩個

享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的方式。

享元模式嘗試重用現有的同類對象,如果未找到匹配的對象,則創建新對象。我們將通過創建 5 個對象來畫出 20 個分布於不同位置的圓來演示這種模式。由於只有 5 種可用的顏色,所以 color 屬性被用來檢查現有的 Circle 對象。

代碼__new__方法裏面的看起來像單例模式,但與單例模式有些區別。

比如selenium webdriver尤其需要控制是你畫的數量,每實例化一個driver出來都彈出一個瀏覽器,消耗巨大的內存不說,上下文之間的瀏覽器狀態還共享不了。

單例模式可以控制不管實例化多少個driver,只會彈出一次瀏覽器,不會無數次彈出新的瀏覽器。

享元模式可以控制不管實例化多少個driver,不會無數次彈出新的瀏覽器。最多彈出一個chrome瀏覽器或者firefox瀏覽器。也就是同種類瀏覽器只能彈出一個。

單例模式,一個貓類,最多只能實例化一個貓,不管是白毛還是黑貓。

享元模式,一個貓類,最多只會實例化出來一個黑貓和白貓實例,不會出現兩個白貓。

# coding: utf-8

import random
from enum import Enum

TreeType = Enum(TreeType
, apple_tree cherry_tree peach_tree) class Tree: pool = dict() def __new__(cls, tree_type): obj = cls.pool.get(tree_type, None) if not obj: obj = object.__new__(cls) cls.pool[tree_type] = obj obj.tree_type = tree_type
return obj def render(self, age, x, y): print(render a tree of type {} and age {} at ({}, {}).format(self.tree_type, age, x, y)) def main(): rnd = random.Random() age_min, age_max = 1, 30 # 單位為年 min_point, max_point = 0, 100 tree_counter = 0 for _ in range(10): t1 = Tree(TreeType.apple_tree) t1.render(rnd.randint(age_min, age_max), rnd.randint(min_point, max_point), rnd.randint(min_point, max_point)) tree_counter += 1 for _ in range(3): t2 = Tree(TreeType.cherry_tree) t2.render(rnd.randint(age_min, age_max), rnd.randint(min_point, max_point), rnd.randint(min_point, max_point)) tree_counter += 1 for _ in range(5): t3 = Tree(TreeType.peach_tree) t3.render(rnd.randint(age_min, age_max), rnd.randint(min_point, max_point), rnd.randint(min_point, max_point)) tree_counter += 1 print(trees rendered: {}.format(tree_counter)) print(trees actually created: {}.format(len(Tree.pool))) t4 = Tree(TreeType.cherry_tree) t5 = Tree(TreeType.cherry_tree) t6 = Tree(TreeType.apple_tree) print({} == {}? {}.format(id(t4), id(t5), id(t4) == id(t5))) print({} == {}? {}.format(id(t5), id(t6), id(t5) == id(t6))) if __name__ == __main__: main()

設計模式,享元模式(7)