Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.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_Android_Architecture_Software Design - Fatal编程技术网

Java 我是否过度使用了单例模式?

Java 我是否过度使用了单例模式?,java,android,architecture,software-design,Java,Android,Architecture,Software Design,我正在自由起诉单身模式,我想知道;什么时候够了,够了?这些都是我现在的单身汉。我并不是像有些人所说的那样,把它们全部用在一起 Database db = Database.getInstance(this); // wrapper for the library Realm realm = Realm.getInstance(this); // library I use AppUtils appUtils = AppUtils.getInstance(this); // app speci

我正在自由起诉单身模式,我想知道;什么时候够了,够了?这些都是我现在的单身汉。我并不是像有些人所说的那样,把它们全部用在一起

Database db = Database.getInstance(this);  // wrapper for the library
Realm realm = Realm.getInstance(this);  // library I use
AppUtils appUtils = AppUtils.getInstance(this); // app specific functions that manipulate database queries to produce targeted values
Utils utils = Utils.getInstance();
Generator gen = Generator.getInstance(this); // necessary for the library
我也在考虑做类似的事情

AppFragments fr=AppFragments.getInstance(此属性为AttributeCommonInEveryActivity>)

或者我应该为它接口并执行
BlerpActivity扩展BlourpActivity


最后,清除可能影响您意见的任何偏见。我知道我似乎只使用一种设计模式,但我不是。我工作时考虑的是设计和实用性是的。是的,你是。但在我开始之前,我认为你甚至没有使用单例模式

采用类似于
Realm.getInstance(this)
的方法,假设
this
是一个
FooClass
。如果
Realm
是一个单例,那么它只会存在一个实例。如果这是真的,那么您为什么要传入此如果传入不同的
FooClass
,结果会不同吗?

现在来谈谈实际问题——单身汉的问题已经讨论了好几次了,所以我就不谈了。相反,我将向您展示另一种选择:依赖注入

以下是
领域
类的单例(?)版本:

class Realm {
    private static final Realm instance = new Realm();

    public static Realm getInstance(FooClass foo) {
        // black magic with foo
        return instance;
    }
}

// usage:
Realm realm = Realm.getInstance(this);
现在,这里是DI版本:

class Realm {
    public Realm(FooClass foo) {
        // black magic with foo
    }
}

// usage:
Realm realm = new Realm(this);

你告诉我哪一个看起来更短。

是的。是的,你是。但在我开始之前,我认为你甚至没有使用单例模式

采用类似于
Realm.getInstance(this)
的方法,假设
this
是一个
FooClass
。如果
Realm
是一个单例,那么它只会存在一个实例。如果这是真的,那么您为什么要传入此如果传入不同的
FooClass
,结果会不同吗?

现在来谈谈实际问题——单身汉的问题已经讨论了好几次了,所以我就不谈了。相反,我将向您展示另一种选择:依赖注入

以下是
领域
类的单例(?)版本:

class Realm {
    private static final Realm instance = new Realm();

    public static Realm getInstance(FooClass foo) {
        // black magic with foo
        return instance;
    }
}

// usage:
Realm realm = Realm.getInstance(this);
现在,这里是DI版本:

class Realm {
    public Realm(FooClass foo) {
        // black magic with foo
    }
}

// usage:
Realm realm = new Realm(this);

你告诉我哪一个看起来更短。

如果
Database db
确实是“库的包装器”,那么你不需要
Realm-Realm
,因为
db
应该包含
Realm
实例,如果
db
以外的其他东西需要它,你可以通过
db
获得它。关于你的另外三个单身汉,在不知道他们做什么的情况下,很难给你建议。但是,有一个具体的理由说明为什么数据需要是全局的。因为“打字很难”而有单身汉不是一个很好的理由。:-)似乎您可以使用一个好的框架,例如。这样,只需适当地创建对象,就可以完全避免手工编写的JVM单例(一种反模式)。@Commonware您好,谢谢您的反馈。这个领域是图书馆,不是我自己建造的。这就是您与DB(称为Realm/lame)通信的方式。这是我唯一无法避免的单身。数据库获取上下文并创建新的RealmInstance以获取常用结果。最后一句话你完全正确。我试着让它像我一样模块化can@MickMnemonic谢谢你的图书馆。我来看看。这些天来,反模式的评论似乎出现了,但我支持“使用任何有用的东西”哇。经过Guice,它看起来像金子一样,这取决于。。。e、 g.对于db,如果此db类表示单个连接,那么singleton可能是错误的选择,如果它有一个连接池并管理所有内容,那么它可能是正确的选择。如果
数据库db
确实是“库的包装器”,那么您不需要
领域
,as
db
应该包含
领域
实例,如果
db
以外的其他东西需要它,您可以通过
db
获得它。关于你的另外三个单身汉,在不知道他们做什么的情况下,很难给你建议。但是,有一个具体的理由说明为什么数据需要是全局的。因为“打字很难”而有单身汉不是一个很好的理由。:-)似乎您可以使用一个好的框架,例如。这样,只需适当地创建对象,就可以完全避免手工编写的JVM单例(一种反模式)。@Commonware您好,谢谢您的反馈。这个领域是图书馆,不是我自己建造的。这就是您与DB(称为Realm/lame)通信的方式。这是我唯一无法避免的单身。数据库获取上下文并创建新的RealmInstance以获取常用结果。最后一句话你完全正确。我试着让它像我一样模块化can@MickMnemonic谢谢你的图书馆。我来看看。这些天来,反模式的评论似乎出现了,但我支持“使用任何有用的东西”哇。经过Guice,它看起来像金子一样,这取决于。。。e、 g.对于db,如果这个db类代表一个单一连接,那么singleton可能是错误的选择,如果它有一个连接池,并且正在管理一切,那么它可能是正确的选择。您好。在不了解内部结构或领域()的情况下,我认为他们使用了类似于
Realm.getInsance(context)
的东西,其中他们将上下文初始化为
this.context=context.getApplicationContext()
,这是唯一且持久的。因此,只要您传递任何形式的
上下文
,它将始终得到相同的结果。同样的事情也适用于我的另一个班级。在不了解内部结构或领域()的情况下,我认为他们使用了类似于
Realm.getInsance(context)
的东西,在这里他们将上下文初始化为
this.context=context.getApplicationContext()
,这是不可更改的