`
tekkenvs11
  • 浏览: 6410 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

简单工厂模式,工厂方法模式和抽象工厂模式的异同

 
阅读更多

简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。用这三种设计模式都可以实现,那究竟这三种设计模式有什么异同呢?下面根据这三者之间的特点,优点,缺点,适用范围进行比较。

一.特点

简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式。它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。

 

工厂方法模式工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次实现更复杂的层次结构,可以应用于产品结果复杂的场合。工厂方法模式是对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

 

抽象工厂模式:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。

 

二.优点

简单工厂模式:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对象的尴尬局面中摆脱出来。外界与具体类隔离开来,偶合性低。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

                     

工厂方法模式工厂方法模式是为了克服简单工厂模式的缺点(主要是为了满足OCP)而设计出来的。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。工厂方法模式完全满足OCP,即它有非常良好的扩展性。

                     

抽象工厂模式抽象工厂模式主要在于应对“新系列”的需求变化。分离了具体的类,抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。抽象工厂模式有助于这样的团队的分工,降低了模块间的耦合性,提高了团队开发效率。

                     

三.缺点

简单工厂模式:当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

                     

工厂方法模式:不易于维护,假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦(对号入座已经是个问题了)。

                     

抽象工厂模式抽象工厂模式在于难于应付“新对象”的需求变动。难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂几乎确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。

                      

四.适用范围

简单工厂模式:工厂类负责创建的对象比较少,客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心。

                     

工厂方法模式当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法。

                     

抽象工厂模式:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

                     

其实,无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。

分享到:
评论

相关推荐

    简单工厂模式_简单工厂模式_

    - 设计模式比较:可能与其他设计模式(如工厂方法、抽象工厂)进行比较,阐述它们之间的异同。 总的来说,简单工厂模式是一种实用的设计模式,尤其适用于需要根据特定条件创建对象的场合。通过学习和实践,我们可以...

    创建型模式之抽象工厂模式(Abstract Factory Pattern)

    3. **当系统只有一种产品族时,抽象工厂模式显得过于繁琐,简单工厂模式或构造函数可能更为合适。 在编程实践中,抽象工厂模式常用于框架和库的设计,例如GUI库中的窗口系统,不同操作系统(如Windows、Linux)需要...

    二十三种设计模式【PDF版】

    设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这...

    设计模式(Patterns in Java)

    设计模式(Patterns in Java) ...设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用new 一样频繁. 设计模式之Prototype(原型) 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的 对象。

    3 模板模式-课程内容.rar

    7. **模板模式与其他设计模式的对比**:对比模板模式与策略模式、工厂模式等其他设计模式的异同,帮助学习者理解各种模式间的联系和区别。 8. **实战演练**:可能包含一些练习题或案例分析,让学习者亲手实践模板...

    设计模式说明文档.docx

    - **抽象工厂模式**:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。 - **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。 - **建造者模式**:将一个复杂对象的构建...

    dot Net中抽象类与接口的区别

    这些特性使得抽象类和接口成为面向对象设计中不可或缺的部分,并广泛应用于各种设计模式中,如工厂模式、策略模式等。 然而,当比较接口与抽象类时,它们之间的差异便显现出来。接口最大的特点是支持多继承。一个类...

    346.344.JAVA基础教程_面向对象(下)-抽象性的练习:基本操作(346).rar

    5. **设计模式实践**:可能涉及单例模式、工厂模式等,这些设计模式经常利用抽象类和接口来实现。 **学习资源** 346.344.JAVA基础教程_面向对象(下)-抽象性的练习:基本操作(346)这个文件可能包含了详细的讲解、...

    java面试——北京-京东-Java中级.zip

    - 工厂模式:简单工厂、工厂方法、抽象工厂的适用场景。 - 适配器模式:如何将不兼容接口转换为可兼容接口。 - 观察者模式:理解事件驱动编程,以及发布/订阅模式。 以上知识点是Java中级面试中的常见主题,熟练...

    java面试题

    - 工厂模式:简单工厂、工厂方法和抽象工厂。 - 适配器模式、装饰者模式、观察者模式等。 9. **JVM优化**: - 参数调整:理解JVM启动参数,如-Xms, -Xmx, -XX:+UseG1GC等。 - 性能监控:VisualVM、JConsole等...

    对于java面试中常见的问题进行总结 .zip

    - **工厂模式**:了解简单工厂、工厂方法和抽象工厂模式的应用场景。 - **装饰器模式**:如何通过装饰器模式动态扩展功能。 9. **JVM** - **内存模型**:理解堆、栈、方法区、程序计数器、本地方法栈的结构。 -...

    java复试题目(面试)

    - **工厂模式**:讲解简单工厂、工厂方法和抽象工厂模式。 - **装饰器模式**:用于动态添加或扩展对象功能的设计模式。 以上仅是部分Java面试中的常见知识点,实际面试中还可能涉及JVM内存模型、反射、注解、...

    120个Java经典面试题和答案

    - **工厂模式**:简单工厂、工厂方法和抽象工厂的区别和应用场景。 - **装饰者模式**:动态地给对象添加新的行为或职责。 以上只是部分Java面试中的常见知识点,实际面试中还可能涉及反射、并发编程、Spring框架...

    Java面试宝典2011版

    - **工厂模式**:简单工厂、工厂方法和抽象工厂模式的应用。 - **其他模式**:如装饰者模式、适配器模式、代理模式等在实际项目中的应用。 9. **Spring框架** - **依赖注入**:理解IoC容器的工作原理,使用@...

    美团Java 岗 154+道面试题

    - **工厂模式**:了解简单工厂、工厂方法、抽象工厂模式。 - **代理模式**:理解静态代理和动态代理的区别。 - **装饰器模式**:了解其在Java IO和AOP中的应用。 8. **JVM** - **内存模型**:理解堆、栈、方法...

    java面试宝典

    77、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 18 78、abstract class Name { private String name; public abstract boolean isStupidName(String name) {}}这有何错误? 18 79、public class ...

    2011各类型面试题汇

    - 工厂方法和抽象工厂模式的区别。 9. **IO流:** - 字节流与字符流的区别。 - 转换流(InputStreamReader/OutputStreamWriter)的使用。 - 文件操作:File类、FileReader/FileWriter等。 - 缓冲流...

    2019年java面试题集锦

    - **工厂模式**:简单工厂、工厂方法和抽象工厂模式的理解与应用。 - **装饰者模式**:用于在不修改对象的情况下添加新功能。 7. **JVM**: - **内存模型**:了解堆、栈、方法区、本地方法栈等区域的作用。 - *...

    Java面经-百度准入职老哥整理(八股文)

    - **工厂模式**:区分简单工厂、工厂方法和抽象工厂模式。 - **装饰器模式**:掌握装饰器模式的应用,如Servlet Filter的实现。 - **代理模式**:了解静态代理和动态代理,如Java的InvocationHandler。 6. **...

Global site tag (gtag.js) - Google Analytics