编程思想设计模式结构模式Structural享元模式flyweight

Posted 炼狱腾蛇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程思想设计模式结构模式Structural享元模式flyweight相关的知识,希望对你有一定的参考价值。

Python版

 

https://github.com/faif/python-patterns/blob/master/structural/flyweight.py

技术分享图片
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
*References:
http://codesnipers.com/?q=python-flyweights

*TL;DR80
Minimizes memory usage by sharing data with other similar objects.
"""

import weakref


class FlyweightMeta(type):

    def __new__(mcs, name, parents, dct):
        """
        Set up object pool

        :param name: class name
        :param parents: class parents
        :param dct: dict: includes class attributes, class methods,
        static methods, etc
        :return: new class
        """
        dct[pool] = weakref.WeakValueDictionary()
        return super(FlyweightMeta, mcs).__new__(mcs, name, parents, dct)

    @staticmethod
    def _serialize_params(cls, *args, **kwargs):
        """
        Serialize input parameters to a key.
        Simple implementation is just to serialize it as a string
        """
        args_list = list(map(str, args))
        args_list.extend([str(kwargs), cls.__name__])
        key = ‘‘.join(args_list)
        return key

    def __call__(cls, *args, **kwargs):
        key = FlyweightMeta._serialize_params(cls, *args, **kwargs)
        pool = getattr(cls, pool, {})

        instance = pool.get(key)
        if instance is None:
            instance = super(FlyweightMeta, cls).__call__(*args, **kwargs)
            pool[key] = instance
        return instance


class Card(object):

    """The object pool. Has builtin reference counting"""
    _CardPool = weakref.WeakValueDictionary()

    """Flyweight implementation. If the object exists in the
    pool just return it (instead of creating a new one)"""
    def __new__(cls, value, suit):
        obj = Card._CardPool.get(value + suit)
        if not obj:
            obj = object.__new__(cls)
            Card._CardPool[value + suit] = obj
            obj.value, obj.suit = value, suit
        return obj

    # def __init__(self, value, suit):
    #     self.value, self.suit = value, suit

    def __repr__(self):
        return "<Card: %s%s>" % (self.value, self.suit)


def with_metaclass(meta, *bases):
    """ Provide python cross-version metaclass compatibility. """
    return meta("NewBase", bases, {})


class Card2(with_metaclass(FlyweightMeta)):

    def __init__(self, *args, **kwargs):
        # print(‘Init {}: {}‘.format(self.__class__, (args, kwargs)))
        pass


if __name__ == __main__:
    # comment __new__ and uncomment __init__ to see the difference
    c1 = Card(9, h)
    c2 = Card(9, h)
    print(c1, c2)
    print(c1 == c2, c1 is c2)
    print(id(c1), id(c2))

    c1.temp = None
    c3 = Card(9, h)
    print(hasattr(c3, temp))
    c1 = c2 = c3 = None
    c3 = Card(9, h)
    print(hasattr(c3, temp))

    # Tests with metaclass
    instances_pool = getattr(Card2, pool)
    cm1 = Card2(10, h, a=1)
    cm2 = Card2(10, h, a=1)
    cm3 = Card2(10, h, a=2)

    assert (cm1 == cm2) != cm3
    assert (cm1 is cm2) is not cm3
    assert len(instances_pool) == 2

    del cm1
    assert len(instances_pool) == 2

    del cm2
    assert len(instances_pool) == 1

    del cm3
    assert len(instances_pool) == 0

### OUTPUT ###
# (<Card: 9h>, <Card: 9h>)
# (True, True)
# (31903856, 31903856)
# True
# False
Python转载版

 

以上是关于编程思想设计模式结构模式Structural享元模式flyweight的主要内容,如果未能解决你的问题,请参考以下文章

编程思想设计模式结构模式Structural享元模式flyweight

编程思想设计模式结构模式Structuralfront_controller

九 合成(Composite)模式 --结构模式(Structural Pattern)

设计模式初识结构型模式(Structural Pattern)

七适配器(Adapter)模式--结构模式(Structural Pattern)

结构型设计模式 Structural Patterns :适配器 Adapter(C++ 实现)