我一直在阅读关于java代理模式和调用处理程序的文章,在任何地方都可以看到客户端可以使用具体的类构造。
例如,
//TwitterService service = (TwitterService) SecurityProxy.newInstance(new TwitterStub());
TwitterService service = new TwitterStub();
System.out.println(service.getTimelinePosts("abc"));
用户可以直接创建TwitterStub
的实例并访问这些方法。我想知道是否有一种方法可以不暴露或避免通过客户端构建混凝土类?
有更好的方法吗?
正如GoF所说,代理模式的目的是"为另一个对象提供代理或占位符,以控制对它的访问"。
因此,在您的特定情况下,会直接创建一个特定的代理实例。只要你(作为客户)知道你想要一个特定类型的代理对象,这就没问题。
如果您想要的是间接级别,则可以使用返回不同类型代理对象的抽象工厂模式。但到目前为止,代理对象的原因是代表其他对象进行操作。
顺便说一句,当您有创建成本高昂的对象时,代理是有用的,但您不想因为这些费用而必然削弱主应用程序功能。例如,假设您有一个包含1000个图像的文档。你可以为它们使用代理,并且只在非常需要的时候加载它们(即当它们在可见视图中时),而且你仍然可以非常快速地加载整个文档,而不需要一次读取1000个图像的开销。