linpyi 2008-08-05 23:10
浏览 587
已采纳

工厂方法模式和抽象工厂模式的区别

看了一些网上的例子,头有点晕,感觉好象差不多,
可能是我看的不够细,
但是还是没办法理解这2钟模式的区别,
和用在什么地方

大家帮忙
[b]问题补充:[/b]
上面讲的是抽象工厂,我想知道他们的分别,我想要真正了解的人告诉我他的理解是什么,而不是网上GOOGLE,出来

2楼说的在ioc中添加工厂有点不理解

抽象工厂模式是让工厂和依赖工厂的子类全部依赖一个接口或者抽象类,因为抽象代表这稳定,这样可以很容易的遵循oo中比较著名的开放关闭原则,设计出来的系统、框架或者程序很富有弹性和扩展能力(这句话有点大概的意思,没有具体的)

网上搜一句话,不知道对还是错
其实这两者的区别,GOF的书上说得很清楚。工厂方法采用的是类继承机制(生成一个子类,重写该工厂方法,在该方法中生产一个对象)。而抽象工厂采用的是对象组合机制,专门定义“工厂”对象来负责对象的创建。对象组合的方式就是把“工厂”对象作为参数传递。

如果是对的,能不能稍微帮我解释下,我看是懂非懂的,最好能用白话文,例子好象都差不多

谢谢

  • 写回答

4条回答 默认 最新

  • piccbj 2008-08-06 11:48
    关注

    工厂模式是:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到子类。
    它有个特点,就是通常工厂的类层次与产品的类层次几乎是一样的树。如果说工厂是你的影子,你就是产品了。在你平时未用到模式的时候,你需要什么就new一个,这种情况就好比你躺在地上,人影合一了。那什么时候需要工厂模式呢。看看定义:“使一个类的实例化延迟到子类”,这个是关键,当你有必要延迟实例化的时候才需要用工厂模式。那什么情况下要延迟呢,在单例模式中有惰性单例(就是单例那个静态属性)……等等,就是一开始你还不适合立刻就创建该对象,你还需要一些资源或其它准备工作。整个系统的运行不像单个程序那样,系统需要很多资源和多方面的协同工作。

    抽象工厂是:提供一个创建一系列相关或相互依赖对象的接口,而无虚指定他们的具体类。
    抽象工厂比工厂模式复杂的多。如果楼主说他们像可能是他们都叫工厂,都生成产品,都是接口型设计模式。但是我觉得他们是两个不同的设计模式。首先他们的目的是不同的。工厂是为了“延迟创建”,而抽象工厂是提供一系列的接口,是为了组织创建对象的灵活性,避免重复,避免耦合低内聚。
    设计模式本身语言晦涩难懂,这个抽象工厂我也是没次都看着头昏眼花^_^,举个运用他的场景:
    1。你有两台单色打印机,一台黑白墨的,一台彩墨的。
    2。你有两种文件要打,一种讲演搞,一种图片

    3。要求是讲演稿如果是有图就打黑白的,没图打彩色的,照片有字的就打黑白的,没字就打彩色的。

    [code="java"]
    class Print{
    ……
    void doTalk(){
    if(flag)
    //color 1
    else
    //non-color 2
    }

    void doPicture(){
    if(flag)
    //color 3
    else
    //non-color 4
    }
    ……
    }
    [/code]

    上面的这个场景就是可以运用抽象工厂来重构的。

    public abstract class AbsFactory{
    abstract TalkPrint getTalkPrint(); //打讲演稿
    abatract PicPrint getPicPrint(); //打图片的
    }

    public class ColorFactory extends AbsFactory{
    TalkPrint getTalkPrint(){
    //彩色讲演稿打印
    }

    PicPrint getPicPrint(){
       //彩色图片打印
    }
    

    }

    public class NonColorFactory extends AbsFactory{
    TalkPrint getTalkPrint(){
    //黑白讲演稿打印
    }

    PicPrint getPicPrint(){
         //黑白图片打印
    }  
    

    }

    public abstract class TalkPrint{
    //抽象的讲演稿打印
    }

    public class colorTalkPrint extends TalkPrint{
    //彩色讲演稿打印
    }

    public class noncolorTalkPrint extends TalkPrint{
    //黑白讲演稿打印
    }

    public abstract class PicPrint{
    //抽象的图片打印
    }

    public class colorPicPrint extends PicPrint{
    //彩色图片打印
    }

    public class noncolorPicPrint extends PicPrint{
    //黑白图片打印
    }

    进一步解释这个场景,就是当你做相似的工作又多种选择的时候,可以考虑用抽象工厂。

    这里你要打印各种文件是一组相似的工作,打印有彩色、黑白等针对打印的不同要求。

    这里仅仅举了一个方面的例子。

    我们可以看出,虽然抽象工厂和工厂在代码形式上很相似,甚至抽象工作可以有工厂来拓展,但是他们的出发点是不一样的。

    在搞单例模式的时候我们针对多线程拓展了为“双重检查模式”,那是同一个场景同一个任务,跟这里是不一样的。

    关于单例模式,我有笔记留在我的博客,欢迎大家来一起讨论:

    http://zhaipuhong.iteye.com/blog/214675

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)