简单工厂模式与工厂方法模式详细解读

转:http://blog.csdn.net/zhengzhb/article/details/7348707

————————————————————————————————————

1.前言

设计模式,各具特色,今天在此总结一下常见模式中 简单工厂模式与工厂方法模式的区别与联系

2.两种模式概要

1. 简单工厂模式 

对于简单工厂模式的介绍,请参考我的另外一篇博客  代码无错就是优?----简单工厂模式

2. 工厂方法模式

  • 工厂方法模式又称工厂模式,也叫虚拟构造器模式属于类的创建型模式
  • 在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象.这样做的目的是将类的实例化操作延迟到子类中完成.由子类决定实例化哪个类

工厂方法模式结构图:

3.两种模式的对比  

对于这两种模式,请参照下表 :


简单工厂模式


工厂方法模式


类型


创建型模式


创建型模式


概念


简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。


定义了一个用于创建对象的接口,让子类决定实例化哪一个类, 工厂方法使一个类的实例化延迟到其子类


特点


无需了解这些对象是如何创建如何组织的


粒度很小的设计模式,是简单工厂模式的衍生 一个抽象工厂对应一个抽象产品


优点


1.       含有必要的逻辑判断 ,随时可以创建产品类的实例

2.       客户端可以避免直接创建产品对象的责任

3.       耦合性低,明确区分了各自的职责

4.       有利于软件体系结构的优化


1.       克服了简单工厂模式的缺点

2.       具体工厂类只完成单一的任务

3.       代码简洁

4.       完全满足OCP,有很好的扩展性


缺点


1.       当产品有复杂的多层次等级结构时,工厂类只有自己,以不变应万变

2.       工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都收到影响

3.       系统扩展困难

4.       违背了开放—封闭原则


1.       不易于维护

2.       当同时需要修改多个产品类时,修改麻烦


适用范围


1.       创建的对象比较少

2.       客户只知道传入了工厂类的方法


1.       当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时

2.       当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时


共同点


本质都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。

4.两种模式结构图 

此处的结构图以及下面的对比代码都是以一个简单的计算器功能为例子,包含四种基本运算加、减、乘、除。

 

   1.简单工厂模式

     

   2.工厂方法模式

     

  注释: 

在简单工厂模式中,一个工厂类处于对产品类进行实例化的中心位置,它知道每一个产品类的细节,并决定适合哪一个产品应当被实例化.简单工厂模式的 优点是能够使客户端独立于产品的创建过程,并且在系统中引入新产品时,不必对客户端进行修改.缺点是当有新产品加入到系统的时候,必须修改工厂类,以加入必要的处理逻辑.   简单工厂模式的致命缺点就是处于核心地位的工厂类, 因为一旦它无法确定要对哪个类进行实例化,就无法使用该模式,而工厂方法模式则可以很好的解决这一问题

在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户端隐藏了哪种具体产品类将被实例化这一细节,工厂方法模式的核心是一个抽象工厂类, 各种具体工厂类通过抽象工厂类将工厂方法继承下来, 如此使得客户可以只关心抽象产品和抽象工厂,完全不用理会会返回哪一种具体产品,也不用关心它是如何被具体工厂创建的

5.两种模式代码

  1.简单工厂模式   

    

[csharp] view plaincopyprint?

  1. public class OperationFactory    ///创建了一个工厂,用户已输入符号,工厂就会判断怎么计算了
  2. {
  3. public static Operation createOperate(string operate)
  4. {
  5. Operation oper = null;
  6. switch (operate)
  7. {
  8. case "+":
  9. oper = new OperationAdd();
  10. break;
  11. case "-":
  12. oper = new OperationSub();
  13. break;
  14. case "*":
  15. oper = new OperationMul();
  16. break;
  17. case "/":
  18. oper = new OperationDiv();
  19. break;
  20. }
  21. return oper;
  22. }
  23. }
  24. }
public class OperationFactory    ///创建了一个工厂,用户已输入符号,工厂就会判断怎么计算了
    {
        public static Operation createOperate(string operate)
        {
            Operation oper = null;
            switch (operate)
            {
                case "+":
                    oper = new OperationAdd();
                    break;
                case "-":
                    oper = new OperationSub();
                    break;
                case "*":
                    oper = new OperationMul();
                    break;
                case "/":
                    oper = new OperationDiv();
                    break;
            }
            return oper;
        }
    }
}

2. 工厂方法模式

[csharp] view
plain
copyprint?

  1. interface Ifactory
  2. {
  3. Operation CreateOperation();
  4. }
  5. class SubFactory  : Ifactory   //减法类工厂
  6. {
  7. public Operation CreateOperation()
  8. {
  9. return new OperationSub();
  10. }
  11. }
  12. class AddFactory : Ifactory   //加法类工厂
  13. {
  14. public Operation CreateOperation()
  15. {
  16. return new OperationAdd();
  17. }
  18. }
  19. class MulFactory : Ifactory   //乘法类工厂
  20. {
  21. public Operation CreateOperation()
  22. {
  23. return new OperationMul();
  24. }
  25. }
  26. class DivFactory : Ifactory   //除法类工厂
  27. {
  28. public Operation CreateOperation()
  29. {
  30. return new OperationDiv();
  31. }
  32. }
 interface Ifactory
    {
        Operation CreateOperation();
    }
    class SubFactory  : Ifactory   //减法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }
    class AddFactory : Ifactory   //加法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }
    class MulFactory : Ifactory   //乘法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationMul();
        }
    }
    class DivFactory : Ifactory   //除法类工厂
    {
        public Operation CreateOperation()
        {
            return new OperationDiv();
        }
    }

注释:

对于两种模式在代码方面的应用看  ,简单工厂模式,如果需要添加功能需要修改 工厂类,而工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你若要加功能,本来是修改工厂类,现在修改的是客户端,工厂模式实际是是简单模式的一种演化。  工厂模式有效的避免了简单工厂模式中违背开放--封闭原则的限制,同时也加你了耦合性,增加了扩展性  。也就是说工厂方法模式 是简单工厂模式的进一步推广!

其实无论应用哪种设计模式,本质上都是提出不变的东西,将可变的东西作为接口,以达到最大程度上的复用,和扩展,而在开发过程中我们该用什么模式,就得根据需要来确定了。每种模式各有自己的利弊好坏。而如何利用这些模式,什么时间去用,就看我们的技术了吧!  这也就是菜鸟和大神的区别吧!  大神是用最少的投资 发挥最大的效益!  这就是我们这些人的奋斗目标 !

本篇系统的总结了一下两种模式,欢迎交流指导!

时间: 2024-10-19 06:25:34

简单工厂模式与工厂方法模式详细解读的相关文章

【C#设计模式——创建型模式】工场方法模式

工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子有点复杂,自己写了一个简单例子: 示例目标:对数组进行定向排序 基类FormatList对指定数组进行排序,具体实现交给子类实现 public abstract class FormatList { public int[] result; protected abstract void Forma

原型模式和模版方法模式

首先我们来了解原型模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 根据定义,我们很明显地知道原型模式的对象是类.通过原型模式,我们可以无限地复制原型的对象 接着我们了解模版方法模式 定义:定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中.模版方法使用使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 其实就是规定完成某件事情需要做多少步,并且规定那些需要你发挥自己的想象.能力根据实际情况去完成的. 综上所述.这两种设计模式的对象不同.原型是一个大的

(4)模版方法模式

(4)模版方法模式 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abstract class

模版方法模式

第八个模式:模版方法模式 8.1引入模版方法模式 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现 下面我们来看模板方法模式的类图: 8.2模板方法的应用 1.使用模板方法排序(很简单,只是需要实现compareTo接口): 现在就可以测试这个类了: 8.3小结

设计模式(java)--模版方法模式之任务分配

转自:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就

23种设计模式(6):模版方法模式

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式. 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abstract class AbstractS

《JAVA与模式》之模板模式(转载)

模板方法在servlet中的应用:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 原文出处:http://blog.csdn.net/zhengzhb/article/details/7405608   定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,

【JS设计模式】温习简单工厂模式、工厂方法模式、抽象工厂模式概念

注:空心箭头表示的是种继承关系,工厂类和产品类之间是一种依赖关系.是用箭头加虚线表示的,以下的模型图是用的实线是不正确(时间不够用,在这里我偷懒了.这个习惯不好,呵呵) 简单工厂模式(Simple Factory Pattern): 使用一个类(通常为单体)来创建实例;简单工厂模式也叫静态工厂方法模式(Static FactoryMethod Pattern). 接口的定义通常是以I开头标识符,在JS中未定义接口或抽象类的语法: var MacBikeFactory = { createBike

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道