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

UML图:

  运算基类:

  

  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 数据运算基类
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class Operation {
  10. private double mNmberA = 0;
  11. private double mNumberB = 0;
  12.  
  13. public double getNumberA() {
  14. return mNmberA;
  15. }
  16.  
  17. public void setNmberA(double numberA) {
  18. this.mNmberA = numberA;
  19. }
  20.  
  21. public double getNumberB() {
  22. return mNumberB;
  23. }
  24.  
  25. public void setNumberB(double numberB) {
  26. this.mNumberB = numberB;
  27. }
  28.  
  29. /**
  30. * 获取运算结果
  31. * @return
  32. */
  33. public double getResult() {
  34. double result = 0;
  35. return result;
  36. }
  37.  
  38. }

  

  具体产品类:

  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 加法类
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class OperationAdd extends Operation {
  10.  
  11. @Override
  12. public double getResult() {
  13. double result = 0;
  14. result = getNumberA() + getNumberB();
  15. return result;
  16. }
  17.  
  18. }

  

  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 减法类
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class OperationSub extends Operation {
  10.  
  11. @Override
  12. public double getResult() {
  13. double result = getNumberA() - getNumberB();
  14. return result;
  15. }
  16.  
  17. }
  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 乘法
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class OperationMul extends Operation {
  10.  
  11. @Override
  12. public double getResult() {
  13. double result = getNumberA() * getNumberB();
  14. return result;
  15. }
  16.  
  17. }
  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 除法类
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class OperationDiv extends Operation {
  10.  
  11. @Override
  12. public double getResult() {
  13. if (getNumberB() == 0) {
  14. throwException();
  15. }
  16.  
  17. double result = getNumberA() / getNumberB();
  18. return result;
  19. }
  20.  
  21. private void throwException() {
  22. try {
  23. throw new Exception("the div number can't be zero.");
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }

  工厂类接口:

  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 算法工厂
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public interface IFactory {
  10. public Operation createOperation();
  11. }

  工厂类:

  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 加法工厂
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class AddFactory implements IFactory {
  10.  
  11. @Override
  12. public Operation createOperation() {
  13. return new OperationAdd();
  14. }
  15.  
  16. }
  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 减法工厂
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class SubFactory implements IFactory {
  10.  
  11. @Override
  12. public Operation createOperation() {
  13. return new OperationSub();
  14. }
  15.  
  16. }
  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 乘法
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class MulFactory implements IFactory {
  10.  
  11. @Override
  12. public Operation createOperation() {
  13. return new OperationMul();
  14. }
  15.  
  16. }
  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 除法工厂
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class DivFactory implements IFactory {
  10.  
  11. @Override
  12. public Operation createOperation() {
  13. return new OperationDiv();
  14. }
  15.  
  16. }

  运算符号类:

  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 加法, 减法, 乘法, 除法
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public enum OperationSymbol {
  10. ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION
  11. }

  测试类:

  1. package com.cnblog.clarck;
  2.  
  3. /**
  4. * 测试类
  5. *
  6. * @author clarck
  7. *
  8. */
  9. public class Client {
  10. public static void main(String[] args) {
  11. IFactory operFactory = new AddFactory();
  12. Operation operation = operFactory.createOperation();
  13. operation.setNmberA(1);
  14. operation.setNumberB(2);
  15. double result = operation.getResult();
  16. System.out.println("add result: " + result);
  17.  
  18. operFactory = new SubFactory();
  19. Operation subOperation = operFactory.createOperation();
  20. subOperation.setNmberA(1);
  21. subOperation.setNumberB(2);
  22. double subResult = subOperation.getResult();
  23. System.out.println("sub result: " + subResult);
  24.  
  25. operFactory = new MulFactory();
  26. Operation mulOperation = operFactory.createOperation();
  27. mulOperation.setNmberA(1);
  28. mulOperation.setNumberB(2);
  29. double mulResult = mulOperation.getResult();
  30. System.out.println("mul result: " + mulResult);
  31.  
  32. operFactory = new DivFactory();
  33. Operation divOperation = operFactory.createOperation();
  34. divOperation.setNmberA(1);
  35. divOperation.setNumberB(2);
  36. double divResult = divOperation.getResult();
  37. System.out.println("div result: " + divResult);
  38.  
  39. }
  40. }

设计模式——工厂模式(Factory Method)的更多相关文章

  1. [设计模式]工厂模式factory

    参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...

  2. 设计模式 - 工厂模式(factory pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...

  3. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

  4. 设计模式——工厂方法(Factory Method)

    定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. ——DP UML类图 模式说明 抽象业务基类 实际业务类的公共基类,也是工厂要创建的所有对象的父类,这部分 ...

  5. 设计模式--工厂模式Factory(创建型)

    工厂模式属于创建型模式,分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一.简单工厂模式 在工厂中做判断,根据产品类型从而创造相应的产品,当增加新产品时需要修改工厂类. 例如: enum CTY ...

  6. c++工厂模式(Factory method)

    下面以女娲造黑人,白人,黄种人的例子来介绍一下工厂模式. 1.工厂的接口,相当于造人工厂总部. class IHumanFactory { public: IHumanFactory(void) { ...

  7. 23种设计模式--工厂模式-Factory Pattern

    一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...

  8. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  9. 设计模式-03工厂方法模式(Factory Method Pattern)

    插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...

随机推荐

  1. 破解MyEclipse

  2. bootstrap日历插件地址

    http://www.bootcss.com/p/bootstrap-datetimepicker/

  3. 案例44-crm练习新增客户使用struts2

    1 src下配置文件 1 struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYP ...

  4. 关于重定向printf出错 Error[Pe020]: identifier "FILE" is undefined 解决方案

    IAR或者Keil用到重定向printf函数出现的错误解决方案 转发请注明出处,谢谢 原创:李剀 https://www.cnblogs.com/kevin-nancy/articles/105851 ...

  5. IDEA 14.0 (默认模式) 快捷键

    IDEA 14.0 (默认模式) 快捷键 1.Alt+Shift+R:重命名变量名.类名.方法名(使用已经使用过的) 2.Ctrl+O :重写方法 3.Alt+Shift+P :实现接口 4.Alt+ ...

  6. struts 2 报错Could not find action or resul 常见错误原因分析

    1.struts.xml配置的action与我们访问的action或返回的result确实没有匹配导致.这个时候要仔细检查Struts.xml配置文件: 2.我们的action输入正确,返回结果经过无 ...

  7. jqgrid 上移下移单元格

    在表格中常常需要调整表格中数据的显示顺序,我用的是jqgrid,实现原理就是将表中的行数保存到数据库中,取数据时按行进行排序 1.上移,下移按钮 <a href="javascript ...

  8. java版两人聊天程序

    server.java import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util ...

  9. js.css嵌入dll

    处理请求,返回 public ActionResult Get() { //传递一个部分名称 var n = Request["n"]; n = n.Replace('/', '. ...

  10. H5 中html 页面存为图片并长按 保存

    最近接到的一个新需求:页面一个静态H5,中间有一页是输入信息,然后跳转到最后一页,自动将页面生成图片,用户可以长按图片保存到手机上. 展示一下最后一页的样子: 刚拿到这个需求,在网上看了很多文章,最普 ...