工厂模式,简单工厂模式,抽象工厂模式 三者有什么区别?

sy_hys 2008-12-09 11:15:31
我在看设计模式时有两个问题
1.工厂模式,简单工厂模式,抽象工厂模式 三者有什么区别?
2.抽象工厂模式与策略模式的本质区别,给我的感觉就是两者的区别在选择实现类的时候,一个是在工厂类中实现,而另一个是在客户端实现的,这样的话我就觉得抽象工厂模式要比策略模式好,因为简单工厂模式的客户端不用关心具体实现使用哪个类,而策略模式的客户端必须选择具体要实现哪个类;而网上说策略模式比简单工厂模式要好,可是我不知到策略模式好在哪里,请明白的帮忙讲讲
...全文
5130 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
taoyangtao 2012-07-06
  • 打赏
  • 举报
回复
14楼太牛x了,精辟~学习了!
petrie 2011-08-22
  • 打赏
  • 举报
回复
http://www.cnblogs.com/keely/archive/2010/04/12/1710323.html
jpphy 2010-08-10
  • 打赏
  • 举报
回复
对于客户端而言,无论是工厂方法模式还是抽象工厂模式:

1、共同点:都是先生成工厂类对象的实例,然后再通过工厂类对象的实例生成产品类对象的实例。

2、不同点:在生成工厂类对象的实例时候,选择工厂类的策略是不同的,工厂方法模式是依据需要的单个产品的特征,而抽象工厂模式则是依据多个产品的共同特征。
wuzhaoyong1986 2010-01-05
  • 打赏
  • 举报
回复
无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。拿一个生产水杯(cup)的工厂举例:起初,不用工厂模式,我必须在生产水杯之前知道水杯的材料和形状等水杯的所有特征才能生产,这就是我们的new Cup();这个Cup必须是具体的。厂主发现同一形状的被子,只是材料不同,如一个是玻璃(glass)的,一个是瓷(china)的,但是确要两条生产线,显然有资源浪费的嫌疑。现在厂主生产杯子时先不让生产线知道我要产的是玻璃的还是瓷的,而是让它在不知道具体材料的情况下先做它能做的,等到它把模具做好,只需要向其中填充玻璃原料或者瓷原料就可以造出同一形状的具体杯子了。但是很可惜,java并不能new一个抽象的Cup,所以就有了简单工厂模式。原来是Cup cup=new Cup;现在是SimpleCupFactory.createCup(String cupName),根据cup的名字生产Cup,而createCup返回的是一个实现了 Cup接口或抽象类的具体Cup。简单抽象工厂模式有一个问题,就是当我现在想生产一个同样形状的铁杯时,工厂里并没有定义相应的处理流程,只能更改createCup方法,这就不合理了。我现在只是想生产铁杯,你只要在最后的时候把玻璃原料换成铁的不就行了吗,干嘛还要更改整条生产线呢?于是就有了工厂模式。原来生产线在生产模具的时候还要考虑是为玻璃杯生产的模具还是为铁杯生产的模具,现在它不用管了。CupFactory.createCup()创建Cup.CupFactory是接口或抽象类。实现它的具体子类会创建符合Cup接口的具体Cup。那么现在厂主想要生产水壶(kettle),用工厂模式就不得不再造一条水壶生产线,能不能在水杯生产线同时生产水壶呢?这就是抽象工厂模式。在原CupFactory中加一个createKettle()方法,用来生产水壶。
rokily 2009-05-08
  • 打赏
  • 举报
回复
网上有人做如下的比较:


工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。


这样看来,抽象工厂中 是应该有 具体工厂和具体产品之间的关联关系的,而楼上的那副图中却没有画出关联关系线,这这么回事吗?请朋友帮解答 谢谢
rokily 2009-05-08
  • 打赏
  • 举报
回复
下面是一副抽象工厂的 类图

rokily 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 infidel 的回复:]
来说说我的看法:
工厂模式,也叫做说虚构造器,在简单工厂中间插入了一个具体产品工厂,这个工厂知道产品构造时候的具体细节,而简单工厂模式的产品具体构造细节是在一个个if/else分支,或者在switch/case分支里面的。工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代…
[/Quote]


支持一下,对工厂模式讲解的很深刻。。。

再问:抽象工厂的类图中,为什么没有 具体工厂类和具体产品类之间的关联关系? 我觉得是应该存在的。
guiji1988 2009-02-19
  • 打赏
  • 举报
回复
抽象工厂模式看起来与工厂方法很相似,只是它使用若干工厂方法模式,每个工厂方法模式创建一个不同类型的对象。
来自《C++编程思想》(2nd Edition vol2)详情参见书中P400-405(中译版页码)
firectrl 2009-02-17
  • 打赏
  • 举报
回复
我学得学习设计模式时,应该把该模式的“意图”和“动机”仔细揣摩几次。
相关模式之间的区别,GOF书中在“相关模式”中都有说明。不能的模式是为了解决不同的问题产生的。
king_of_hj 2009-02-15
  • 打赏
  • 举报
回复
工厂模式 一般在创建对象时候起识别选择创建的作用,
抽象工厂则是,在里面可以建造很多对象,可以关联,大多是不关联的,
builder 是建复杂的单个对象,
做鸡真好吃 2009-01-13
  • 打赏
  • 举报
回复
JF
InfidelX 2009-01-05
  • 打赏
  • 举报
回复
来说说我的看法:
工厂模式,也叫做说虚构造器,在简单工厂中间插入了一个具体产品工厂,这个工厂知道产品构造时候的具体细节,而简单工厂模式的产品具体构造细节是在一个个if/else分支,或者在switch/case分支里面的。工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代码。而在简单工厂中,如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支,工厂模式符合软件开发中的OCP原则(open close principle),对扩展开放,对修改关闭。

抽象工厂模式:这个模式我总是感觉和builder模式非常相似。
工厂方法模式提供的是对一个产品的等级模式,,而抽象工厂方法提供的是对多个产品的等级模式,注意,这里的多个具体产品之间是相互耦合的,也就是说这里的抽象工厂提供的产品之间是存在某种联系的。
fastmask 2008-12-16
  • 打赏
  • 举报
回复
在实际的代码中使用一下,你才会有更多的理解。
或者假设一些场景。
sy_hys 2008-12-12
  • 打赏
  • 举报
回复
看来我是得多看些书了,呵呵
taodm 2008-12-10
  • 打赏
  • 举报
回复
楼主啊,找本好点的设计模式的教材。工厂模式都能和策略模式扯一起比较了,你看的资料也实在太差了点。
去找本《深入浅出设计模式》看看吧。
hhyttppd 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sy_hys 的回复:]
1.工厂模式,简单工厂模式,抽象工厂模式 三者有什么区别?
这个区别讲模式的书上都会有。我也是个模式初学者。


这三者区别我没找到呀,谁能帮我贴出来
[/Quote]

你把三者的UML图找着,对比一下。。
qap22 2008-12-09
  • 打赏
  • 举报
回复
友情up
hhyttppd 2008-12-09
  • 打赏
  • 举报
回复
1.工厂模式,简单工厂模式,抽象工厂模式 三者有什么区别?
这个区别讲模式的书上都会有。我也是个模式初学者。

2.抽象工厂模式与策略模式的本质区别,给我的感觉就是两者的区别在选择实现类的时候,一个是在工厂类中实现,而另一个是在客户端实现的,这样的话我就觉得抽象工厂模式要比策略模式好,因为简单工厂模式的客户端不用关心具体实现使用哪个类,而策略模式的客户端必须选择具体要实现哪个类;而网上说策略模式比简单工厂模式要好,可是我不知到策略模式好在哪里,请明白的帮忙讲讲.

首先,模式都有适用性限制,可以满足要求就行,没有本质上的好坏之分,只要在条件已知(需求),某个比另一个能好用。

1 这三种创建型模式都不需要知道具体类(concrete class)
2 简单模式要求具体类必须已知(固定),客户端类一般不能改变创建的规则。
3 抽象工厂允许客户端提供具体类,只要实现一个一个具体工厂,进而也能改变创建规则。
4 策略模式允许客户端类改变创建的规则,只需要提供一个策略类。
sy_hys 2008-12-09
  • 打赏
  • 举报
回复
具体些,在什么时候使该使用什么模式
hhyttppd 2008-12-09
  • 打赏
  • 举报
回复
因地适宜
加载更多回复(5)
工厂模式详解 概述 为什么需要工厂模式工厂模式的类型 简单工厂模式 基本概念 类图结构 示例:创建不同类型的图形 1. 定义抽象产品接口 2. 实现具体产品类 3. 创建简单工厂类 4. 客户端使用 改进版简单工厂:使用枚举类型 简单工厂模式总结 工厂方法模式 基本概念 类图结构 示例:创建不同类型的图形 1. 定义抽象产品接口 2. 实现具体产品类 3. 定义抽象工厂接口 4. 实现具体工厂类 5. 客户端使用 工厂方法模式的变体:参数化工厂方法 工厂方法模式总结 抽象工厂模式 基本概念 类图结构 示例:创建不同风格的UI组件 1. 定义抽象产品接口 2. 实现具体产品类 3. 定义抽象工厂接口 4. 实现具体工厂类 5. 客户端使用 抽象工厂模式的扩展 1. 添加新的抽象产品接口 2. 实现新的具体产品类 3. 修改抽象工厂接口 4. 修改具体工厂类 5. 客户端使用 抽象工厂模式总结 三种工厂模式的比较 简单工厂模式 vs 工厂方法模式 vs 抽象工厂模式 如何选择合适的工厂模式? 三种工厂模式的转化关系 工厂模式的优缺点 工厂模式的优点 工厂模式的缺点 适用场景 通用适用场景 具体模式适用场景 简单工厂模式适用场景 工厂方法模式适用场景 抽象工厂模式适用场景 实际应用场景示例 数据库访问层的设计 跨平台UI组件库 日志记录系统 Java标准库中的工厂模式应用 1. Java集合框架 2. JDBC 3. Calendar类 4. NumberFormat类 5. Java AWT和Swing 6. XML解析器 工厂模式与其他设计模式的关系 1. 工厂模式与单例模式 2. 工厂模式与建造者模式 3. 工厂模式与策略模式 4. 工厂模式与模板方法模式 实际应用案例 1. Spring框架中的BeanFactory 2. JDBC中的DriverManager

5,529

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧