<p>我要问的第一个问题是,为什么方法<code>getfromStorage</code>不向用户公开实现:</p>
<pre><code>def getfromStorage(name):
if name in process_storage:
return process_storage[name]
return Processo(name)
</code></pre>
<p>和<code>Processo</code>定义为:</p>
<pre><code>class Processo:
def __init__(self, name, ...): # ... for simplicity
self.processoname = name
</code></pre>
<p>这似乎可以解决你的问题。但如果您不想或无法公开基础缓存,则:</p>
<p><strong>另一种类似于您正在尝试的方式</strong></p>
<p>我相信适合你需要的模式是所谓的桥模式,也被称为把手/身体模式。引用Gamma<em>等人的<em>设计模式</em>,该模式用于多种情况,其中包括“您希望在多个对象之间共享一个实现,<strong><em>这一事实应该对客户端隐藏</em></strong>,或者您总是希望客户端访问实际的“主体”由于某些其他原因,通过“handle”对象实现。“handle”对象保留对“body”实现的引用,并将所有调用委托给该实现。当然,多个句柄可以引用同一个主体。在下面的示例中,我使用了一个抽象基类,这在Python的duck类型中是不必要的</p>
<pre><code>from abc import ABC, abstractmethod
class Processo(ABC):
@abstractmethod
def __init__(self, name): raise NotImplementedError
@abstractmethod
def get_name(self): raise NotImplementedError
@abstractmethod
def foo(self): raise NotImplementedError
class Processo_Handle(Processo): # the handle class
def __init__(self, name):
self.processo = getfromStorage(name)
def get_name(self):
return self.processo.get_name() # delegate to "body" object
def foo(self):
self.processo.foo() # delegate to "body" object
return self # don't return result of the call to foo because it's the wrong instance (i.e. the body)
class Processo_Body(Processo): # the bodyclass
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
def foo(self):
""" do whatever it takes """
return self
process_storage = {} # dummy implementation
def getfromStorage(processoname):
if processoname in process_storage:
return process_storage[processoname]
return Processo_Body(processoname)
</code></pre>