工厂模式可以分为三类:

1)简单工厂模式(Simple Factory)

2)工厂方法模式(Factory Method)

3)抽象工厂模式(Abstract Factory)

这三种模式从上到下逐步抽象,并且更具一般性。

GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。

将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类。实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类实例。(只需要一个Factory类)

简单工厂模式中有如下三种角色:

Product:抽象产品类,将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中。

ConcreteProduct:具体产品类,将需要创建的各种不同产品对象的相关代码封装到具体产品类中。

Factory:工厂类,提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入参数的不同创建不同的具体产品对象。Factory类为静态类或包含静态方法。

客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。

下面以实现一个简单运算器为例。运算类Operation相当于抽象产品类,它定义了一个抽象方法用来计算结果,具体计算步骤交给子类实现。这里一共有四个子类,相当于具体产品类,分别实现加减乘除的计算功能。运算工厂类OperationFactory完成创造实例的过程。

package simpleFactory;public abstract class Operation {protected double number_A=0;protected double number_B=0;public Operation(){}public abstract double GetResult() throws Exception;
}
package simpleFactory;public class AddOperation extends Operation {  //加法类,继承运算类。@Overridepublic double GetResult() {double result=0;result=number_A+number_B;return result;}
}
public class SubOperation extends Operation {   //减法类,继承运算类。@Overridepublic double GetResult() {double result=0;result=number_A-number_B;return result;}
}
public class MulOperation extends Operation {   //乘法类,继承运算类。@Overridepublic double GetResult() {double result=0;result=number_A*number_B;return result;}
}
public class DivOperation extends Operation {   //除法类,继承运算类。@Overridepublic double GetResult() throws Exception {double result=0;if(number_B==0){throw new Exception("除数不能为0。");}result=number_A/number_B;return result;}
}
package simpleFactory;public class OperationFactory {public static Operation CreateOperate(String operate){Operation oper=null;switch(operate){case "+":oper=new AddOperation();break;case "-":oper=new SubOperation();break;case "*":oper=new MulOperation();break;case "/":oper=new DivOperation();break;}return oper;}
}
package simpleFactory;public class Main {public static void main(String[] args) throws Exception {Operation oper=OperationFactory.CreateOperate("/");oper.number_A=1;oper.number_B=2;double result=oper.GetResult();}
}

简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。其缺点是一旦我们需要添加新的具体产品类,则需要修改Factory逻辑。这样违背了OCP(开放-关闭原则)

采用工厂方法模式可以克服这一缺点。

工厂方法模式的一种特例——简单工厂模式相关推荐

  1. android 静态工厂方法,Android 源码中的静态工厂方法

    我们知道工厂模式有三兄弟,通常我们说的工厂模式指的是工厂方法模式,它的应用频率最高.本篇博客分享的简单工厂模式是工厂方法模式的"小弟",确切的来讲它不属于设计模式,而是一种方法.此 ...

  2. python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点

    前言 在<设计模式>一书中工厂模式提到了: 工厂方法模式(Factory Method) 抽象工厂模式 (Abstract Factory) 但是在实际过程中还有一种工厂模式经常被使用,那 ...

  3. 设计模式:工厂方法模式(C++)【简单工厂进行升级】

    工厂方法模式介绍 我们接上一集设计模式:简单工厂模式(C++),在简单工厂模式中,知道它的优点可以将我们从自己生产产品中解放出来,它的缺点: 1. 必须提供一个产品类型 给工厂 然后工厂给我们生产产品 ...

  4. JAVA设计模式是个什么玩意儿_00_工厂模式家族准备篇_简单工厂模式

    1. 前言 又叫静态工厂方法(Static Factory Method)模式. 它并不是GoF那23种设计模式之一. 简单工厂模式是工厂模式家族中最简单实用的模式. 虽然很简单,但它是学习工厂方法模 ...

  5. 设计模式(2)——创建型——工厂相关:简单工厂(Simple factory),工厂方法(Factory method),抽象工厂(Abstract factory)

    概要 这里试图描述23个设计模式中的两个工厂(Factory)相关的设计模式:工厂方法(Factorymethod),抽象工厂(Abstract factory). 注意点: 这两个都属于创建型设计模 ...

  6. java 工厂模式 计算器_java设计模式之简单工厂模式

    在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装):如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetRes ...

  7. 对象容器设计模式_容器对象模式。 一种新的测试模式。

    对象容器设计模式 如果您搜索什么是页面对象的描述,您会发现页面对象模式为我们提供了一种以可重用和可维护的方式对内容建模的常识方法. 还要指出:在Web应用程序的UI中,您的测试与某些区域交互. Pag ...

  8. 容器对象模式。 一种新的测试模式。

    如果您搜索什么是页面对象的描述,就会发现页面对象模式为我们提供了一种以可重用和可维护的方式对内容建模的常识方法. 还要指出:在Web应用程序的UI中,您的测试与某些区域交互. Page Object只 ...

  9. python中代理模式分为几种类型_代理模式

    JDK 自带的动态代理 java.lang.reflect.Proxy:生成动态代理类和对象: java.lang.reflect.InvocationHandler(处理器接口):可以通过invok ...

最新文章

  1. 观察者设计模式二:回调函数
  2. cad新手必练300图_[CAD]平面练习图,CAD新手练技术练速度的好去处
  3. asp.net 调用带证书的webservice解决办法
  4. strlen和mb_strlen的区别
  5. 石头剪刀布python代码_python实现石头剪刀布程序
  6. LeetCode 437. 路径总和 III(双重递归)
  7. 解决Android学习之ScollView嵌套ListView和GridView问题
  8. EDA技术实用教程 | 复习八 | 多位加法器的行为级描述
  9. 检查dota2服务器是否在线,dota2服务器ping测试脚本分享
  10. Asp.net中汉字转换成为拼音
  11. android 关闭第三方应用,Android禁用第三方应用
  12. magicbook大学计算机系,大学开学选择哪款笔记本? Redmibook 14全面对比荣耀Magicbook...
  13. 迅捷pdf转换成word转换器 4.1 官方版
  14. 车间调度标准测试集汇总-FJSP、PFSP、JSP、HFSP和分布式车间调度测试集
  15. python列表题目_Python列表练习题
  16. docker部署开发环境
  17. python调整图片亮度_python调整图片亮度的示例
  18. 如何选择合适的网络自动化工具
  19. 订阅切换按钮(subscribe toggle button)
  20. Wireshark搜索关键字内容

热门文章

  1. WP7中,如何把7.1的项目改为7.0的
  2. outlook常见错误分析指南
  3. ssl证书的生成与签名
  4. [swift] LeetCode 21. Merge Two Sorted Lists
  5. 【iOS】Swift3:context.executeFecthRequest(request, error: nil)
  6. 系统分析师视频教程下载
  7. Java Servlet Filter
  8. java 按字节读写二进制文件(Base64编码解码)
  9. Qlik发布中国战略,为实现更大成功而不懈努力
  10. gulp自己主动化任务脚本在HybridApp开发中的使用