水边
一只青蛙在笑

      ——石头和水

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

这里在简单和工厂的基础上写工厂:

先定义一个接口

 package cn.no5.factorymethod;

 import cn.no1.simplefactory.Operation;

 public interface IFactory {

     Operation CreateOperation();
}

再定义其子类:

 package cn.no5.factorymethod;

 import cn.no1.simplefactory.Operation;
import cn.no1.simplefactory.OperationAdd;
import cn.no1.simplefactory.OperationSub;
import cn.no1.simplefactory.OperationMultiply;
import cn.no1.simplefactory.OperationDivide; public class AddFactory implements IFactory { @Override
public Operation CreateOperation() {
return new OperationAdd();
} }
public class SubFactory implements IFactory { @Override
public Operation CreateOperation() {
return new OperationSub();
} }
public class MultiplyFactory implements IFactory { @Override
public Operation CreateOperation() {
return new OperationMultiply();
} }
public class DivideFactory implements IFactory { @Override
public Operation CreateOperation() {
return new OperationDivide();
} }

测试类:

 package cn.no5.factorymethod;

 import java.util.Scanner;

 import cn.no1.simplefactory.Operation;

 public class _Test {

     public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入数字1:");
double numA = sc.nextDouble();
System.out.println("输入数字2:");
double numB = sc.nextDouble();
System.out.println("输入操作符:");
String operator = sc.next();
sc.close();
IFactory operFactory = null;
switch (operator) {
case "+":
operFactory = new AddFactory();
break;
case "-":
operFactory = new SubFactory();
break;
case "*":
operFactory = new MultiplyFactory();
break;
case "/":
operFactory = new DivideFactory();
break; }
Operation oper = operFactory.CreateOperation();
oper.setNumA(numA);
oper.setNumB(numB);
double result = oper.calculate();
System.out.println("计算结果是:"+result);
}
}

现在应该可以发现简单工厂和工厂方法的区别了:

工厂方法比简单工厂麻烦多了?这种感性的回答可不能算数,得从流程上分析它们的区别。

简单工厂:客户端无需判断创建哪个实例对象,但是需要把符号数据传入简单工厂,简单工厂根据传入的符号返回实例对象。

工厂方法:客户端需要根据符号判断创建哪个工厂对象,所以无需再传入什么符号,工厂对象直接调用方法返回实例对象。

考虑两个场景:

1、需要创建10个加法实例:

如果你使用简单工厂,你需要传10次符号(比如10次“+”)给简单工厂,既然知道都是加法,干嘛还要重复传10次”+“?!不好意思,客户端不考虑这些,他只负责给工厂传参数就能得到实例;

如果你使用工厂方法,直接创建加法工厂,调用其生产方法10次即可。

这下简单工厂的使用范围也就清楚了。就是在比较简单的情况下使用简单工厂。比如计算器。客户端只操作一次,得到一个运算实例,但谁也不知道用户要输入什么操作符号,索性把符号丢给简单工厂。

2、需要添加numA的numB次方业务逻辑

使用简单工厂,需要扩展运算类,并且修改简单工厂类的createOperation方法。

使用工厂方法,需要扩展运算类和工厂类。

简单工厂在业务逻辑改变时对自身方法进行了修改,违背了开放-封闭原则

工厂方法克服了简单工厂违背开放-封闭原则的缺陷

Java学习笔记——设计模式之五.工厂方法的更多相关文章

  1. C#设计模式学习笔记:(2)工厂方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  2. java 23 - 1 设计模式之工厂方法模式

    转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

  3. Spring4.0学习笔记(6) —— 通过工厂方法配置Bean

    1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...

  4. Java学习笔记——设计模式之一.简单工厂

    蜀道之难.难于上青天,侧身西望长咨嗟 --蜀道难 设计模式第一篇,简单工厂. 定义Operation类 package cn.no1.simplefactory; public abstract cl ...

  5. 0040 Java学习笔记-多线程-线程run()方法中的异常

    run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...

  6. Java学习笔记——设计模式之二.策略模式

    明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...

  7. 1.8(java学习笔记)继承与方法的重写

    继承 在java中可以通过继承提高代码的复用率. 例如A继承了B,就可以是 例如,首先有一个类似Person,这个类中有有一些属性和方法,我们再新建一个Student类,其中有一部分属性和方法与Per ...

  8. Java学习笔记(六)——方法

    一.方法定义 1.语法: 其中: (1) 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.private 甚至可以省略 ,其中 public 表示该方法可以被其他任何 ...

  9. 疯狂java学习笔记之面向对象(三) - 方法所属性和值传递

    方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调 ...

随机推荐

  1. JS+CSS实现的下拉刷新/上拉加载插件

    闲来无事,写了一个当下比较常见的下拉刷新/上拉加载的jquery插件,代码记录在这里,有兴趣将代码写成插件与npm包可以留言. 体验地址:http://owenliang.github.io/pull ...

  2. iOS开发--Runtime的简单使用之关联对象

    一.Runtime关联对象的方法简介: 在<objc/runtime.h>中,有三个关联的方法,分别是: objc_setAssociatedObject objc_getAssociat ...

  3. 光环国际PRINCE2培训费是多少?

    光环国际学习PRINCE2新活动 第一重好礼:获得商务背包一个 第二重好礼:获得600元学习代金券一张 第三重好礼:获得高清流程图一张 活动时间:2017年3月20日-3月31日 PRINCE2 (P ...

  4. C语言精神

    国际标准化组织与1990年发布了第一个ANSI/ISO C标准 在该委员会制定的指导原则中,最有趣的可能是:保持C的精神.委员会在表达这一精神时列出了一下几点: 信任程序员: 不要妨碍程序员做需要做的 ...

  5. 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字

    1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...

  6. 让TextView里面的文字逐个显示的动画效果实现(1)

    最近使用TextView时想要实现里面的文字逐个显示的动画效果,就如同打字一样. 主要实现思想:新建一个TextView的派生类,先将要逐个显示的字符串保存变量 mOriginalStr 中,然后启动 ...

  7. add spring-boot-modules to maven project

    spring boot 项目中 多modules parent 冲突 在IDEAJ 中,如果建立多多modules 项目,pom文件应该是这样: <groupId>cn.ifengkou& ...

  8. oracle调用array参数存储过程

    declare -- Non-scalar parameters require additional processing files tyt_gas2014_search; ,); temp1 t ...

  9. 一个只有99行代码的JS流程框架(二)

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 张镇圳,腾讯Web前端高级工程师,对内部系统前端建设有多年经验,喜欢钻研捣鼓各种前端组件和框架. 导语 前面写 ...

  10. python在接口测试的实际应用

    今天看到@51Testing软件测试网 关于"关于接口测试的总结"的文章,进去浏览了一下,文章主要是针对接口测试的理论性的描述,而实战的内容没有涉及到.刚好今天我将我的系列文章的& ...