1 工厂模式的作用,为什么要用工厂模式?

工厂模式是为了解耦:把对象的创建和使用的过程分开。就是Class A 想调用Class B,那么只是调用B的方法,而至于B的实例化,就交给工厂类。

工厂模式可以降低代码重复。如果创建B过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。可以把这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的维护。

工厂模式可以减少错误,因为工厂管理了对象的创建逻辑,使用者不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。

2.工厂模式的一些适用场景:

对象的创建过程/实例化准备工作很复杂,需要很多初始化参数,查询数据库等

类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变

3.示例演示

下面实现一个加减乘除的工厂方法模式

  1. package demo8;
  2. /**
  3. * 工厂接口
  4. *
  5. */
  6. interface IFactory {
  7. Operation CreateOperation();
  8. }
  9. package demo8;
  10. /**
  11. * 具体工厂(Concrete Creator)角色:加法类工厂
  12. *
  13. */
  14. public class AddFactory implements IFactory {
  15. @Override
  16. public Operation CreateOperation() {
  17. return new OperationAdd();
  18. }
  19. }
  20. package demo8;
  21. /**
  22. * 具体工厂(Concrete Creator)角色:减法类工厂
  23. *
  24. */
  25. public class SubFactory implements IFactory {
  26. @Override
  27. public Operation CreateOperation() {
  28. return new OperationSub();
  29. }
  30. }
  31. package demo8;
  32. /**
  33. * 具体工厂(Concrete Creator)角色:乘法类工厂
  34. *
  35. */
  36. public class MulFactory implements IFactory {
  37. @Override
  38. public Operation CreateOperation() {
  39. return new OperationMul();
  40. }
  41. }
  42. package demo8;
  43. /**
  44. * 具体工厂(Concrete Creator)角色:除法类工厂
  45. *
  46. */
  47. public class DivFactory implements IFactory {
  48. @Override
  49. public Operation CreateOperation() {
  50. return new OperationDiv();
  51. }
  52. }
  53. package demo8;
  54. /**
  55. * 抽象产品(Product)角色:运算类
  56. *
  57. */
  58. public abstract class Operation {
  59. private double numberA = 0;
  60. private double numberB = 0;
  61. public void setNumberA(double numberA) {
  62. this.numberA = numberA;
  63. }
  64. public void setNumberB(double numberB) {
  65. this.numberB = numberB;
  66. }
  67. public double getNumberA() {
  68. return numberA;
  69. }
  70. public double getNumberB() {
  71. return numberB;
  72. }
  73. public double getResult() {
  74. double result = 0;
  75. return result;
  76. }
  77. }
  78. package demo8;
  79. /**
  80. * 具体产品(Concrete Product)角色:加法类
  81. *
  82. */
  83. public class OperationAdd extends Operation {
  84. @Override
  85. public double getResult() {
  86. double result = 0;
  87. result = super.getNumberA() + super.getNumberB();
  88. return result;
  89. }
  90. }
  91. package demo8;
  92. /**
  93. * 具体产品(Concrete Product)角色:减法类
  94. *
  95. */
  96. public class OperationSub extends Operation {
  97. @Override
  98. public double getResult() {
  99. double result = 0;
  100. result = super.getNumberA() - super.getNumberB();
  101. return result;
  102. }
  103. }
  104. package demo8;
  105. /**
  106. * 具体产品(Concrete Product)角色:乘法类
  107. *
  108. */
  109. public class OperationMul extends Operation {
  110. @Override
  111. public double getResult() {
  112. double result = 0;
  113. result = super.getNumberA() * super.getNumberB();
  114. return result;
  115. }
  116. }
  117. package demo8;
  118. /**
  119. * 具体产品(Concrete Product)角色:除法类
  120. *
  121. */
  122. public class OperationDiv extends Operation {
  123. @Override
  124. public double getResult() {
  125. double result = 0;
  126. if (super.getNumberB() == 0)
  127. throw new ArithmeticException("除数不能为0.");
  128. result = super.getNumberA() / super.getNumberB();
  129. return result;
  130. }
  131. }
  132. package demo8;
  133. /**
  134. * 客户端
  135. *
  136. */
  137. public class Demo8 {
  138. public static void main(String[] args) {
  139. IFactory operFactory = new AddFactory();
  140. Operation oper = operFactory.CreateOperation();
  141. oper.setNumberA(10);
  142. oper.setNumberB(7);
  143. double result = oper.getResult();
  144. System.out.println(result);
  145. }
  146. }

java 工厂模式的作用,为什么要用工厂模式以及示例演示的更多相关文章

  1. JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)

    简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...

  2. Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  3. JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式

    上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...

  4. Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  5. java-23种设计模式概述【软件设计模式基本介绍(是什么、作用、优点)、模式的分类和介绍】

    一.设计模式基本介绍(是什么.作用.优点) 1.软件设计模式是什么? 软件设计模式(Software Design Pattern),又称设计模式. 2.设计模式的作用 ★ 提高代码的可复用性.可维护 ...

  6. 创建型模式(前引)简单工厂模式Simple Factory

    一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...

  7. JAVA设计模式(09):结构型-代理模式(Proxy)

    代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...

  8. JAVA中protected的作用

    JAVA中protected的作用   1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是 ...

  9. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

随机推荐

  1. Web安全测试(一)-手工安全测试方法&修改建议

    常见问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击.它指的是恶意攻击者往Web 页面里插入恶意 html代码,当用户浏览该页之 ...

  2. Struts2漏洞

    近日,Struts2曝出2个高危安全漏洞,一个是使用缩写的导航参数前缀时的远程代码执行漏洞,另一个是使用缩写的重定向参数前缀时的开放式重定向漏洞.这些漏洞可使黑客取得网站服务器的“最高权限”,从而使企 ...

  3. 【BZOJ】1680: [Usaco2005 Mar]Yogurt factory(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1680 看不懂英文.. 题意是有n天,第i天生产的费用是c[i],要生产y[i]个产品,可以用当天的也 ...

  4. 微信 Mustache

    最近微信小程序非常火,对于前端开发的程序员是个利好的消息,这里主要记录下微信小程序  Mustache语法. 小程序开发的wxml里,用到了Mustache语法.所以,非常有必要把Mustache研究 ...

  5. 用MathType编辑上下尖括号有什么技巧

    在MathType中,同一个数学符号可以进行各种变换方向的使用,就比如箭头符号,任意方向都可以使用,这也是很常见的.数学中的符号能够根据各种特殊需要进行灵活使用,除了箭头符号之外,其它符号也可以,比如 ...

  6. Eclipse设置护眼背景

    Window-->Preferences-->General-->Editors-->Text Editors-->Background color 自定义颜色:色调:8 ...

  7. VMThread占CPU高基本上是JVM在频繁GC导致,原因基本上是冰法下短时间内创建了大量对象堆积造成频繁GC。

    今天线上一个java进程cpu负载100%.按以下步骤查出原因. 1.执行top -c命令,找到cpu最高的进程的id 2.执行top -H -p pid,这个命令就能显示刚刚找到的进程的所有线程的资 ...

  8. ubuntu 下 Nginx相关设置

    ubuntu安装Nginx之后的文件结构大致为: 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下 启动程序文件在/usr/ ...

  9. [LintCode] A + B 问题

    Bit-by-Bit summation: class Solution { public: /* * @param a: The first integer * @param b: The seco ...

  10. mongoDB之find()

    一.find方法 db.collection_name.find();查询 查询所有结果 1) db.users.find();类似于select * from users; 指定返回那些列(键) 2 ...