g*******7 发帖数: 269 | 1 【 以下文字转载自 Java 讨论区 】
发信人: ginger007 (ginger), 信区: Java
标 题: 工厂模式
发信站: BBS 未名空间站 (Mon Jun 30 16:20:35 2014, 美东)
看了一些关于工厂模式系列的文章,怎么实现都很清楚,但很少提到为什么需要工厂模式
,它解决了什么问题.或者反过来说,如果不用工厂模式,我们可能会遇到哪些问题? |
g*****g 发帖数: 34805 | 2 Singleton is the most common reason you want to use factory pattern.
【在 g*******7 的大作中提到】 : 【 以下文字转载自 Java 讨论区 】 : 发信人: ginger007 (ginger), 信区: Java : 标 题: 工厂模式 : 发信站: BBS 未名空间站 (Mon Jun 30 16:20:35 2014, 美东) : 看了一些关于工厂模式系列的文章,怎么实现都很清楚,但很少提到为什么需要工厂模式 : ,它解决了什么问题.或者反过来说,如果不用工厂模式,我们可能会遇到哪些问题?
|
x****u 发帖数: 44466 | 3 且不说单元测试之类的,没有工厂类生存空间管理,引用计数什么的都不好做。
【在 g*******7 的大作中提到】 : 【 以下文字转载自 Java 讨论区 】 : 发信人: ginger007 (ginger), 信区: Java : 标 题: 工厂模式 : 发信站: BBS 未名空间站 (Mon Jun 30 16:20:35 2014, 美东) : 看了一些关于工厂模式系列的文章,怎么实现都很清楚,但很少提到为什么需要工厂模式 : ,它解决了什么问题.或者反过来说,如果不用工厂模式,我们可能会遇到哪些问题?
|
Y**G 发帖数: 1089 | |
k**********g 发帖数: 989 | 5
Because calling the constructor of a class is a form of hard-coding - the
type (class name) of the class you are creating.
In many situations, the rules for deciding which concrete class to create is
too complicated. Also it is not extensible - you cannot make existing code
create a different class (say, your own derived class instead of the base
class). Also, derived classes may require additional constructor arguments,
for which existing code hardwired to call the base class constructor will
not be able to provide.
As one tries to workaround the issue of making constructor-calling code
extensible, one would inevitably follow the footstep of factory patterns,
and onward for dependency injection patterns. You as a programmer will also
inevitably embark this journey, unless you quit programming.
【在 g*******7 的大作中提到】 : 【 以下文字转载自 Java 讨论区 】 : 发信人: ginger007 (ginger), 信区: Java : 标 题: 工厂模式 : 发信站: BBS 未名空间站 (Mon Jun 30 16:20:35 2014, 美东) : 看了一些关于工厂模式系列的文章,怎么实现都很清楚,但很少提到为什么需要工厂模式 : ,它解决了什么问题.或者反过来说,如果不用工厂模式,我们可能会遇到哪些问题?
|
N******K 发帖数: 10202 | 6 从来没用过这玩意
我都是用模板
is
code
,
【在 k**********g 的大作中提到】 : : Because calling the constructor of a class is a form of hard-coding - the : type (class name) of the class you are creating. : In many situations, the rules for deciding which concrete class to create is : too complicated. Also it is not extensible - you cannot make existing code : create a different class (say, your own derived class instead of the base : class). Also, derived classes may require additional constructor arguments, : for which existing code hardwired to call the base class constructor will : not be able to provide. : As one tries to workaround the issue of making constructor-calling code
|
d*******r 发帖数: 3299 | 7 大牛的意思是因为 TheSingletonClass 只能有一个构造函数,所以才需要 factory
pattern?
说来惭愧,自己工作中维护或者修改过的C++代码,经常有 factory pattern,
但是我从来没搞懂为啥要用这个。。。哈哈。。。
【在 g*****g 的大作中提到】 : Singleton is the most common reason you want to use factory pattern.
|
B********r 发帖数: 397 | 8 hibernate sessionFactory, connection pool, 最好的一个栗子. |
g*****g 发帖数: 34805 | 9 factory is not limited to singleton, but singleton has to use factory
otherwise how do you guarantee only one instance will be created?
【在 d*******r 的大作中提到】 : 大牛的意思是因为 TheSingletonClass 只能有一个构造函数,所以才需要 factory : pattern? : 说来惭愧,自己工作中维护或者修改过的C++代码,经常有 factory pattern, : 但是我从来没搞懂为啥要用这个。。。哈哈。。。
|
g*******t 发帖数: 7704 | 10 编译器决定的,根本不需要知道什么factory, 若干年前就没什么pattern,singleton
【在 g*****g 的大作中提到】 : factory is not limited to singleton, but singleton has to use factory : otherwise how do you guarantee only one instance will be created?
|
|
|
h*d 发帖数: 214 | 11
singleton
”若干年前”?你知道DP早于“若干年前”就有了吗?为什么要DP?为了解决一个共同
的问题,大家都喜欢用自己的解决方案,结果很难保证在团队环境里的代码质量。
【在 g*******t 的大作中提到】 : 编译器决定的,根本不需要知道什么factory, 若干年前就没什么pattern,singleton
|
c*********e 发帖数: 16335 | 12 工厂模式就是用interface,abstract 之类的搞个模子,然后具体到什么了你就创建个
具体的class.比如工厂模式里有个animal的interface,然后你这次要创建个monkey的
class,下次要创建个panda的class....
【在 g*******7 的大作中提到】 : 【 以下文字转载自 Java 讨论区 】 : 发信人: ginger007 (ginger), 信区: Java : 标 题: 工厂模式 : 发信站: BBS 未名空间站 (Mon Jun 30 16:20:35 2014, 美东) : 看了一些关于工厂模式系列的文章,怎么实现都很清楚,但很少提到为什么需要工厂模式 : ,它解决了什么问题.或者反过来说,如果不用工厂模式,我们可能会遇到哪些问题?
|
N******K 发帖数: 10202 | 13 Panda AAA; 不就行了
【在 c*********e 的大作中提到】 : 工厂模式就是用interface,abstract 之类的搞个模子,然后具体到什么了你就创建个 : 具体的class.比如工厂模式里有个animal的interface,然后你这次要创建个monkey的 : class,下次要创建个panda的class....
|
c*********e 发帖数: 16335 | 14 factory模式可以节省不少代码,goodbug提到的singleton也是其一。
【在 N******K 的大作中提到】 : Panda AAA; 不就行了
|
N******K 发帖数: 10202 | 15 auto Panda_ptr = static_cast(factory.create("Panda"));
这种?
【在 c*********e 的大作中提到】 : factory模式可以节省不少代码,goodbug提到的singleton也是其一。
|
c*********e 发帖数: 16335 | 16 兄弟,java里面没指针。你是搞c++的吧?
【在 N******K 的大作中提到】 : auto Panda_ptr = static_cast(factory.create("Panda")); : 这种?
|
N******K 发帖数: 10202 | 17 c++也有工厂模式
【在 c*********e 的大作中提到】 : 兄弟,java里面没指针。你是搞c++的吧?
|
c*********e 发帖数: 16335 | 18 我朋友以前搞c++,n年前换到c#了,现在吃香的喝辣的,用个framework,工作太轻松了
,做梦都笑醒了。
【在 N******K 的大作中提到】 : c++也有工厂模式
|
N******K 发帖数: 10202 | 19 四大牛人
【在 c*********e 的大作中提到】 : 我朋友以前搞c++,n年前换到c#了,现在吃香的喝辣的,用个framework,工作太轻松了 : ,做梦都笑醒了。
|
c*********e 发帖数: 16335 | 20 哪四大?
【在 N******K 的大作中提到】 : 四大牛人
|
|
|
N******K 发帖数: 10202 | 21 朋友 同学 老乡 亲戚
【在 c*********e 的大作中提到】 : 哪四大?
|
k**********g 发帖数: 989 | 22 So much discussion.
Factory method is just so simple: wrap the constructor call into an ordinary
method.
(1) If the "ordinary method" is a static method, we can ask why we need
static methods (why we need to wrap a constructor call into it.) This is a
simple case of a utility method.
C bindings for C++ classes often need to wrap the constructor into a static
method. This is the only way C can call into it.
(2) If the "ordinary method" is a class method, we can ask why we need
classes (why we need a class to construct other things.) This is called the
builder pattern.
(3) If the "ordinary method" is a virtual or interface method, we can ask
why we need interfaces, inheritances or override methods (why we need OOP.)
It allows us to swap in other implementations, especially -- implementations
you don't know you don't know
Happy 4th of July. |
T*******x 发帖数: 8565 | 23 学了。
ordinary
static
the
【在 k**********g 的大作中提到】 : So much discussion. : Factory method is just so simple: wrap the constructor call into an ordinary : method. : (1) If the "ordinary method" is a static method, we can ask why we need : static methods (why we need to wrap a constructor call into it.) This is a : simple case of a utility method. : C bindings for C++ classes often need to wrap the constructor into a static : method. This is the only way C can call into it. : (2) If the "ordinary method" is a class method, we can ask why we need : classes (why we need a class to construct other things.) This is called the
|
i**p 发帖数: 902 | 24 Factory method is different from Abstract Factory. I assume LZ is asking
Abstract Factory.
ordinary
static
the
【在 k**********g 的大作中提到】 : So much discussion. : Factory method is just so simple: wrap the constructor call into an ordinary : method. : (1) If the "ordinary method" is a static method, we can ask why we need : static methods (why we need to wrap a constructor call into it.) This is a : simple case of a utility method. : C bindings for C++ classes often need to wrap the constructor into a static : method. This is the only way C can call into it. : (2) If the "ordinary method" is a class method, we can ask why we need : classes (why we need a class to construct other things.) This is called the
|
g*****g 发帖数: 34805 | 25 And factory pattern is different from factory method too. So the elaboration
is irrelevant to begin with.
【在 i**p 的大作中提到】 : Factory method is different from Abstract Factory. I assume LZ is asking : Abstract Factory. : : ordinary : static : the
|
e********3 发帖数: 18578 | 26 Good post, from my understanding, I think factory method pattern is used to
consolidate the creation of similar objets. Because the object creation is
centralized, you can have more control, for example, restrict the total
number of objects created to implement the singleton pattern.
ordinary
static
the
【在 k**********g 的大作中提到】 : So much discussion. : Factory method is just so simple: wrap the constructor call into an ordinary : method. : (1) If the "ordinary method" is a static method, we can ask why we need : static methods (why we need to wrap a constructor call into it.) This is a : simple case of a utility method. : C bindings for C++ classes often need to wrap the constructor into a static : method. This is the only way C can call into it. : (2) If the "ordinary method" is a class method, we can ask why we need : classes (why we need a class to construct other things.) This is called the
|
w******w 发帖数: 126 | 27 没有想到这里这么多大牛竟然没有把 factory pattern 的作用讲清楚? |
w******w 发帖数: 126 | 28 好吧. 那我就献丑 献丑了!
看了那么多的回复, 个人感觉貌似都木有见到点子上.
好的 OO design 好处就是在你的需求变化下 你的client 可以适应这种变化而不需要
改动.
打个比方.
一个application 用办公室打印机的例子.
如果hard code like below:
Printer *pPrinter = new HP();
pPrinter->print();
如果有一天打印机变了准备用 canon的打印机. 那么你的client code 大约是这个样子.
Printer *pPrinter = new Canon();
pPrinter->print();
你的client 代码改动了. 因为你的需求变化了. 现在用canon打印机了.
OO design 的核心就是: 抽象不要依赖于实现, 相反实现要依赖于抽象.
好了, 再说一下 工厂模式的设计.
Idealy 应该你的代码是这样的:
Printer *pPrinter = FactorInstance("Configure_file");
pPrinter->print();
要把你的client的变化 引到外面去!
你的FactorInstance 这个对象 是读取一个config file 你们有类似于 printer =
canaon. 这样的字段. 然后FactorInstance 再根据相应的字段创建相应的object.
这样的好处就是你的client 代码不管需求如何变化, client代码是不用改动的.
打个比方 , 如果某天 , 需求又变了. 说 要用 brother 的打印机. 那么好了. 你就在
你的config file 你提供上 printer = brother 就可以 了.
当然你的 FactorInstance 你们再加上 if printer = brother then return new
Brother(); 类似于这样的语句 就可以了.
当然你需要加上 支持brother 的dll or so 啥驱动就好仂
这个也是符合软件 的 OCP 的设计原则. 即 对添加开放, 对改动关闭的原则!
所以这样的好处就是 以后需求变化, 你在config 你们改动, 然后在FactorInstance
那里添加一个判断. 再把相应的driver 拷贝进去就可以了. 那么你的client 的代码就
没有必要改动了.
个人理解, 如有不正确的地方, 请指正! |
w******w 发帖数: 126 | 29 其实其他语言 像 C# Java 当中的framework 都大量的用到了 pattern的东西.
可能大家木有注意到而已. 像Java的 Spring framework 里面的那个啥用来创建对象
的bean 其实背后就是工厂模式的典型应用. 只不过有不少开发的人只是知道这么用,
但是这么用的好处在哪里可能没有仔细的推敲而已. |
e********3 发帖数: 18578 | 30 Java IO里面的一堆InputStreem的class就是用了decorator pattern,不过我面试过了
起码有好几十号candidate,没有几个人知道这个。
【在 w******w 的大作中提到】 : 其实其他语言 像 C# Java 当中的framework 都大量的用到了 pattern的东西. : 可能大家木有注意到而已. 像Java的 Spring framework 里面的那个啥用来创建对象 : 的bean 其实背后就是工厂模式的典型应用. 只不过有不少开发的人只是知道这么用, : 但是这么用的好处在哪里可能没有仔细的推敲而已.
|
|
|
w******w 发帖数: 126 | 31 decorator pattern 也是很多地方用到. 设计核心就是 is a 再加上 has a 构成了
decorator pattern的实现.
是的, 很多人就是拿起来用. 但是背后的具体实现貌似很多人不关心!
不过作为一个好的软件开发人员, 了解一下这些还是挺好的. 不过 不了解也无所谓,
拿来用用就好了. 像我这样的了解很多pattern的 还不是一样在家里待业. 反观人家不
了解的大把的赚银子不是?
哪说理去啊? ^_^ |
g*******7 发帖数: 269 | 32 跟我最近在project里面coding的感觉有共同的地方。多谢指点。
子.
【在 w******w 的大作中提到】 : 好吧. 那我就献丑 献丑了! : 看了那么多的回复, 个人感觉貌似都木有见到点子上. : 好的 OO design 好处就是在你的需求变化下 你的client 可以适应这种变化而不需要 : 改动. : 打个比方. : 一个application 用办公室打印机的例子. : 如果hard code like below: : Printer *pPrinter = new HP(); : pPrinter->print(); : 如果有一天打印机变了准备用 canon的打印机. 那么你的client code 大约是这个样子.
|
T*******x 发帖数: 8565 | 33 我觉得你这个理解抽象程度不高。
子.
【在 w******w 的大作中提到】 : 好吧. 那我就献丑 献丑了! : 看了那么多的回复, 个人感觉貌似都木有见到点子上. : 好的 OO design 好处就是在你的需求变化下 你的client 可以适应这种变化而不需要 : 改动. : 打个比方. : 一个application 用办公室打印机的例子. : 如果hard code like below: : Printer *pPrinter = new HP(); : pPrinter->print(); : 如果有一天打印机变了准备用 canon的打印机. 那么你的client code 大约是这个样子.
|
k**********g 发帖数: 989 | 34
太抽象就找抽了。又不是毕卡索。
【在 T*******x 的大作中提到】 : 我觉得你这个理解抽象程度不高。 : : 子.
|
w******w 发帖数: 126 | 35 啥意思? 理解的抽象程度不高?
我说的是工厂模式的一个应用场合. 不是泛泛的讨论模式设计.
:-)
【在 T*******x 的大作中提到】 : 我觉得你这个理解抽象程度不高。 : : 子.
|