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

来源:互联网 发布:mac没有中文输入法 编辑:程序博客网 时间:2024/04/28 19:32

今天看 Spring 书籍说 Spring容器 其实可看成是一个超大型的工厂,如实再次学习了下 工厂设计模式

工厂设计模式有两种实现:

工厂方法模式:定义一个创建对象的接口,由子类决定要实例化的类是哪一个,工厂方法让类的实例化推迟到子类。

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类。

以上的定义有点抽象:

那么 这两种的主要区别是什么呢?(在网上有如下的理解个人觉得是对的)

理解1:

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

理解2:

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

抽象工厂是:提供一个创建一系列相关或相互依赖对象的接口,而无虚指定他们的具体类。
抽象工厂比工厂模式复杂的多。如果楼主说他们像可能是他们都叫工厂,都生成产品,都是接口型设计模式。但是我觉得他们是两个不同的设计模式。首先他们的目的是不同的。工厂是为了“延迟创建”,而抽象工厂是提供一系列的接口,是为了组织创建对象的灵活性,避免重复,避免耦合低内聚。

我的理解:先看两个类图:

1:工厂方法

2:抽象工厂

比较上面的类图:抽象工厂方法其实是可以依赖工厂方法的 (类图中原料对象的创建就是用的工厂方法) ,抽象 就是把多个产品的一个公共的特性给抽象出来,这样可以提供代码的复用程度也是针对抽象编程,这就是抽象工厂的主要目的,而抽象出来的类(如上面类图的原料) 可以用工厂方法设计。而对于工厂方法,我们可以看出一类工厂只能生产一类具体的对象。