英文:
Does this code use the Proxy or Singleton pattern, or both of them?
问题
public interface SomeObject {
void process();
}
public class SomeObjectImpl implements SomeObject {
public SomeObjectImpl() {
...
}
@Override
public void process() {
...
}
}
public class AnotherObject implements SomeObject {
private SomeObject object;
@Override
public void process() {
if (object == null) {
object = new SomeObjectImpl();
}
object.process();
}
}
I think it's the Singleton pattern because it states that a class must ensure that only a single instance should be created and a single object can be used by all other classes. In the example, when SomeObject
is null
, an instance is created as required.
However, it also looks like the Proxy pattern is used because SomeObject
is the proxy.
Is this code really using both patterns? Or is the Proxy pattern used only?
英文:
public interface SomeObject {
void process();
}
public class SomeObjectImpl implements SomeObject {
public SomeObjectImpl() {
...
}
@Override
public void process() {
...
}
}
public class AnotherObject implements SomeObject {
private SomeObject object;
@Override
public void process() {
if (object == null) {
object = new SomeObjectImpl();
}
object.process();
}
}
I think it's the Singleton pattern because it states that a class must ensure that only a single instance should be created and a single object can be used by all other classes. In the example, when SomeObject
is null
an instance is created as required.
However, it also looks like the Proxy pattern is used, because SomeObject
is the proxy.
Is this code really using both patterns? Or is the Proxy pattern used only?
答案1
得分: 1
单例模式 的目的是确保单例类的实例只存在一个。
给定的代码是否确保了这一点?不是,因为没有任何阻止你从两个类 SomeObjectImpl
和 AnotherObject
(只需调用它们的默认构造函数)创建任意多个实例。
提示: 参考 Wikipedia 上的单例模式页面 获取不同语言的实现示例... 一旦你了解了如何创建单例,那么最好永远不要在真实代码中使用它们,因为这是创建 难以测试的软件 ⚡ 并且拥有将所有内容粘合在一起的 全局变量 ⚡ 的最佳方式。
代理模式 的目的是控制对对象的访问或在访问对象时提供一些附加功能。
给定的代码是否看起来像这样?是的。
两个类 SomeObjectImpl
和 AnotherObject
实现了接口 SomeObject
。在代理模式的术语中,该接口代表了提供某些操作的 Subject,即 process
方法。然后,SomeObjectImpl
类是实际的实现;代理模式称之为 RealSubject。而 AnotherObject
类只是简单地委托给实际实现 SomeObjectImpl
,也就是一个 代理。
鉴于该代码,代理 的目的(或附加功能)是缓存 SomeObjectImpl
的一个实例,以便于后续的 process
调用。当对象的创建成本很高时,这是有意义的。例如,当 process
方法的实现需要设置一些外部资源或需要进行“大”的预分配内存时,...
英文:
The Singleton Pattern's purpose is to ensure that only one instance of the singleton class ever exists.
Does the given code ensure that? No, because nothing prevents you from creating as many instances as you like from the two classes SomeObjectImpl
and AnotherObject
(by just invoking their default constructor).
Hint: See the Wikipedia page on Singleton Pattern for implementation examples in different languages... and once you've seen how to create singletons – then forget about using them in real code, ever – as it's the best way for creating untestable software ⚡ and having global variable(s) ⚡ gluing everything together.
The Proxy Pattern's purpose is to control the access to an object or to provide some additional functionality upon accessing an object.
Does the given code look something like that? Yes.
The two classes SomeObjectImpl
and AnotherObject
implement the interface SomeObject
. That interface (in terms of the Proxy Pattern) represents the Subject providing some action, i.e. the process
method. The SomeObjectImpl
class is then the acutal implementation; the RealSubject (as named by the Proxy Pattern). While AnotherObject
class simply delegates to the actual implemenation SomeObjectImpl
, i.e. it's a Proxy.
Given that code, the Proxy's purpose (or additional functionality) is to cache an instance of SomeObjectImpl
for subsequent process
calls. This makes sense when the object creation is a costly operation. For example, when the process
method implementation requires the setup of some external resources or requires "big" upfront memory allocations, ...
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论