Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这段代码使用代理模式还是单例模式,或者两者都使用?_Java_Design Patterns - Fatal编程技术网

Java 这段代码使用代理模式还是单例模式,或者两者都使用?

Java 这段代码使用代理模式还是单例模式,或者两者都使用?,java,design-patterns,Java,Design Patterns,我认为这是单例模式,因为它声明一个类必须确保只创建一个实例,并且一个对象可以被所有其他类使用。在本例中,当SomeObject为null时,将根据需要创建一个实例 但是,它看起来也使用了代理模式,因为SomeObject是代理 这段代码真的使用了这两种模式吗?还是只使用代理模式?单例模式的目的是确保单例类只存在一个实例 给定的代码是否确保了这一点?不,因为没有什么可以阻止您从两个类SomeObjectImpl和另一个对象(通过调用它们的默认构造函数)创建尽可能多的实例 提示:有关不同语言的实现示

我认为这是单例模式,因为它声明一个类必须确保只创建一个实例,并且一个对象可以被所有其他类使用。在本例中,当
SomeObject
null
时,将根据需要创建一个实例

但是,它看起来也使用了代理模式,因为
SomeObject
是代理

这段代码真的使用了这两种模式吗?还是只使用代理模式?

单例模式的目的是确保单例类只存在一个实例

给定的代码是否确保了这一点?不,因为没有什么可以阻止您从两个类
SomeObjectImpl
另一个对象
(通过调用它们的默认构造函数)创建尽可能多的实例

提示:有关不同语言的实现示例,请参阅。。。一旦你了解了如何创建单例,那就永远忘了在实际代码中使用它们,因为这是创建不稳定软件的最佳方法⚡ 以及具有全局变量⚡ 把所有东西粘在一起


代理模式的目的是控制对对象的访问,或在访问对象时提供一些附加功能

给定的代码是这样的吗?对

两个类
SomeObjectImpl
AnotherObject
实现接口
SomeObject
。该接口(就代理模式而言)表示提供某种操作的主体,即
过程
方法。然后,
SomeObjectImpl
类是实际实现;RealSubject(由代理模式命名)。而
另一个对象
类只是委托给实际的实现
SomeObjectImpl
,即它是一个代理


给定该代码,代理的目的(或附加功能)是缓存
SomeObjectImpl
的实例,以供后续的
过程调用。当对象创建是一项代价高昂的操作时,这是有意义的。例如,当
过程
方法实现需要设置一些外部资源或需要“大”的前期内存分配时,

鉴于您这里的问题和其他(类似)问题,我建议您也看看。请注意,在这里提问之前,您需要尽最大努力自己解决问题。检查你的因果报应,回答自己这个(和其他)问题是否真的是基于你的最大努力?@Ivo Mori,好的,明白了,谢谢你的回答!
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();
    }
}