目前能想到的最完善的方案和这个类似:
要求Foo
类必须包含一个不带参的构造函数,这样的话,构造完成之后,用到的地方不用再把参数塞进getInstance
里。
和这个答主说的一样,问题在于,一般我们想把Foo
做成单例时,如果Foo
包含带参数的构造函数,意味着我们想直接通过参数构造一个全局唯一的实例。但是根据上一段话,我们也希望它同时包含不带参的构造函数方便后续调用。
但这样一来,这个不带参的构造函数的意义并不在于"构造",实际上我们期望不通过它来构造,就显得很不自然。而且可能一上来误用不带参的 ctor 导致这个单例没构造成功。
我期望的用法是:
Foo
包含一个带参构造函数(比如Foo::Foo(int a)
),只能通过它来构造;Foo::getInstance(123)
,则成功构造,后续应当支持Foo::getInstance()
这种简便写法;Foo::getInstance()
,则报错,停止构造目前想到的在无参的Foo::Foo()
中,直接抛异常。这样能满足以上需求,但是却很不优雅,希望Foo
类不动,通过修改singleton
来实现。
想了一晚上了,没想出好办法。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.