水边
一只青蛙在笑

      ——石头和水

工厂方法模式(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. Ant.SOA微服务框架开源

    开源地址:https://github.com/yuzd/AntServiceStack   框架特色0.Service Management(服务治理) 1.CodeGen Contract Fir ...

  2. Java基础—String类小结

    一.String类是什么 public final class String implements java.io.Serializable, Comparable<String>, Ch ...

  3. [SinGuLaRiTy] COCI 2011~2012 #2

    [SinGuLaRiTy-1008] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 测试题目 对于所有的题目:Time Limit:1s   ...

  4. 老李谈JVM内存模型

    老李谈JVM内存模型   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨 ...

  5. svn检出服务器项目中出现的could not connect to server

    今天来新同事,新配的电脑装上SVN,Myeclipse后,检出服务器的项目老是出现文件不存在,could not connect to server.最后上网搜了下, 1.先用电脑ping服务器,看网 ...

  6. android中的 Toast 和 AlertDialog

    Toast 一般用来显示一些不需要用户操作的提示信息,举个栗子: public void toast(String msg) { //---创建并设置显示的内容和显示时长 Toast toast = ...

  7. EM最大期望算法-走读

    打算抽时间走读一些算法,尽量通俗的记录下面,希望帮助需要的同学.   overview: 基本思想:      通过初始化参数P1,P2,推断出隐变量Z的概率分布(E步):      通过隐变量Z的概 ...

  8. 04 Feasibility of Learning

    机器学习是设计算法A,在假设集合H里,根据给定数据集D,选出与实际模式f最为相近的假设g(g可能与f相同,也可能不同). 那什么情况下学习是可行的?即保证g和f是相似的. 1.数据集内的表现g约等于f ...

  9. JavaScript Array 技巧

    filter():返回该函数会返回true的项组成的数组 ,,,,]; var result = num.filter(function(item,index,array){ ); }) consol ...

  10. javascript的getter和setter(转)

    显然这是一个无关IE(高级IE除外)的话题,尽管如此,有兴趣的同学还是一起来认识一下ECMAScript5标准中getter和setter的实现.在一个对象中,操作其中的属性或方法,通常运用最多的就是 ...