锁定老帖子 主题:基础知识: 需求!
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-08-21
我看不出这个例子是什么意思
|
|
返回顶楼 | |
发表时间:2004-08-21
其实, 这点相当关键. 我只是从来没有认为这里面会有不同意见.
如果能够证明: 用了静态工厂之后, 影响了外部的一些必须要的设计的灵活性, 那么静态厂自然是错误的. 所谓必须要, 我这里要给出一点说明: 1. 外界要求继承我不认为是个合理的要求. 能否继承, 是类设计者说了算的. 只要我给了你定制, 抽象的能力(比如, 通过接口组合), 你就没有足够的权利来要求继承我. 我要final自然有我的道理. 2. 外界要求用一个特定的函数名字(比如构造函数的名字)来调用我也不认为是个合理的要求. 这在接口编程里是常识. 你因为Object提供了equals()而不是isEquals()而愤慨? 那是你自己的事. 你因为Calendar没有公开构造函数所以你被迫调用静态工厂? 我仍然不认为这是一个合理的抱怨. 你可以adapter的呀 这些基本的契约只能是强制的. |
|
返回顶楼 | |
发表时间:2004-08-21
potian 写道 我看不出这个例子是什么意思
嗯? 这不是外部要求实现的singleton吗? 那你是什么意思? 看来还是有误会. 障碍重重啊. 那么, 我实在不得不要求你给出一个你心目中当构造函数公有的时候, 你怎么可以自由地singleton的例子. 然后我来试试基于我的静态厂来达到同样的要求 |
|
返回顶楼 | |
发表时间:2004-08-21
对每一个类要求继承自然是不合理的,但绝大部分的类都不可以继承我是不同意的,这是OO的基本设施
第二点理论上我同意,getInstance和new 是一样的。但既然Java已经提供了new,getInstance应该算是额外的了。还有一个重要的问题是大家都已经认同了这个new,不然的话,你去getInstance,我去instance,所以从名字本身的角度来讲,new比getInstance要好 |
|
返回顶楼 | |
发表时间:2004-08-21
ajoo 写道 potian 写道 我看不出这个例子是什么意思
嗯? 这不是外部要求实现的singleton吗? 那你是什么意思? 看来还是有误会. 障碍重重啊. 那么, 我实在不得不要求你给出一个你心目中当构造函数公有的时候, 你怎么可以自由地singleton的例子. 然后我来试试基于我的静态厂来达到同样的要求 我试着来理解一下,我现在可以用XSingleton得到XSingleton.instance,即 I x = XSingleton.instance() 第一个程序里面我已经在使用了,然后我在另一个程序里面发现我并且需要lazy intialization,这个时候我怎么办?或者第一个程序里面建立的是X的实例,第二个程序里面需要Y的某个实例(同样实现I),那我怎么办? |
|
返回顶楼 | |
发表时间:2004-08-21
potian 写道 对每一个类要求继承自然是不合理的,但绝大部分的类都不可以继承我是不同意的,这是OO的基本设施
第二点理论上我同意,getInstance和new 是一样的。但既然Java已经提供了new,getInstance应该算是额外的了。还有一个重要的问题是大家都已经认同了这个new,不然的话,你去getInstance,我去instance,所以从名字本身的角度来讲,new比getInstance要好 对继承, 我的观点是每个类具体分析. 给每个类的作者自由选择是否允许继承的权利. 至于继承是否重要到是oo的基本设施,这又是一个大坑. 你可以看看c++世界对java只支持单继承的批判, 也可以看看很多人对接口组合代替继承的阐述, 这世界并不是只有一种声音的. 对名字, 有两个方面. 有好的, 因为静态工厂方法可以命名, 于是你可以起比较有意义的名字. 这点你可以看看我给的哪个连接里他举的例子. 另一方面是不好的,就是静态方法没有约定. 所以学习成本和复杂度有所提高. |
|
返回顶楼 | |
发表时间:2004-08-21
potian 写道 ajoo 写道 potian 写道 我看不出这个例子是什么意思
嗯? 这不是外部要求实现的singleton吗? 那你是什么意思? 看来还是有误会. 障碍重重啊. 那么, 我实在不得不要求你给出一个你心目中当构造函数公有的时候, 你怎么可以自由地singleton的例子. 然后我来试试基于我的静态厂来达到同样的要求 我试着来理解一下,我现在可以用XSingleton得到XSingleton.instance,即 I x = XSingleton.instance() 第一个程序里面我已经在使用了,然后我在另一个程序里面发现我并且需要lazy intialization,这个时候我怎么办?或者第一个程序里面建立的是X的实例,第二个程序里面需要Y的某个实例(同样实现I),那我怎么办? 你这个论述我没有看懂. 所以我用老办法复述都不知道从哪开始. 还是请你给一个例子, 让我看看你说的用了构造函数就可以得到的灵活性是什么样子的. (我有点怀疑的是, 这个论断最后还要追溯到某一个容器不支持静态工厂上) |
|
返回顶楼 | |
发表时间:2004-08-21
你这个XSinglton和X之间什么关系,好像不是静态工厂了
|
|
返回顶楼 | |
发表时间:2004-08-21
我理解的外部创建逻辑就是不知道在哪个package, 哪层, 有一个模块想要控制X的实例的生成(比如想singleton一下). 所以才写了那么个东西出来.
这不是你说的外界可以自由采取各种创建逻辑吗? 如果我理解错了, 没关系. 盼望你能写一个使用构造函数的例子. 不需要太详细, 什么api的名字, 具体语法都不重要, 示意即可. 对着例子, 讨论就会容易许多. 误会也会少很多. |
|
返回顶楼 | |
发表时间:2004-08-21
我明白了
好 假设X最早是为了集群环境建立的,内部使用了JDBC来建立singleton,现在我不想要那个JDBC的依赖,怎么办呢 第一个程序里面继续还要JDBC |
|
返回顶楼 | |