由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 工厂模式 (转载)
相关主题
[合集] can C++ constructor be private? the answer is YES!what is the difference?
请问static variable init的问题?python: how to import a decorator?
C++里最常用的design pattern都有哪些?Is "Singleton" design pattern a type of "Factory method" de
C++ 用户定义exception的标准用法是什么?factory and abstract factory 的区别
question about Design PatternsHow many people use design patterns when coding?
请教几个C++问题delete this problem
请教个Bloomberg 的 C++ 题目The C++ questions I've been asked
c++ questionC++ Singleton Help
相关话题的讨论汇总
话题: factory话题: method话题: class话题: pattern
进入Programming版参与讨论
1 (共1页)
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
4
不用工厂模式怎么注入?
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?

相关主题
请教几个C++问题what is the difference?
请教个Bloomberg 的 C++ 题目python: how to import a decorator?
c++ questionIs "Singleton" design pattern a type of "Factory method" de
进入Programming版参与讨论
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 的大作中提到】
: 四大牛人
相关主题
factory and abstract factory 的区别The C++ questions I've been asked
How many people use design patterns when coding?C++ Singleton Help
delete this problem[合集] which design pattern is used if a static variable insid
进入Programming版参与讨论
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 其实背后就是工厂模式的典型应用. 只不过有不少开发的人只是知道这么用,
: 但是这么用的好处在哪里可能没有仔细的推敲而已.

相关主题
请问关于c++实现singleton的问题?请问static variable init的问题?
问个参数读入和传递的设计问题C++里最常用的design pattern都有哪些?
[合集] can C++ constructor be private? the answer is YES!C++ 用户定义exception的标准用法是什么?
进入Programming版参与讨论
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 的大作中提到】
: 我觉得你这个理解抽象程度不高。
:
: 子.

1 (共1页)
进入Programming版参与讨论
相关主题
C++ Singleton Helpquestion about Design Patterns
[合集] which design pattern is used if a static variable insid请教几个C++问题
请问关于c++实现singleton的问题?请教个Bloomberg 的 C++ 题目
问个参数读入和传递的设计问题c++ question
[合集] can C++ constructor be private? the answer is YES!what is the difference?
请问static variable init的问题?python: how to import a decorator?
C++里最常用的design pattern都有哪些?Is "Singleton" design pattern a type of "Factory method" de
C++ 用户定义exception的标准用法是什么?factory and abstract factory 的区别
相关话题的讨论汇总
话题: factory话题: method话题: class话题: pattern