Java学习笔记——设计模式之五.工厂方法
水边
一只青蛙在笑
——石头和水

工厂方法模式(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学习笔记——设计模式之五.工厂方法的更多相关文章
- C#设计模式学习笔记:(2)工厂方法模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...
- java 23 - 1 设计模式之工厂方法模式
转载: JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- Spring4.0学习笔记(6) —— 通过工厂方法配置Bean
1.静态工厂方法: bean package com.spring.factory; public class Car { public Car(String brand) { this.brand ...
- Java学习笔记——设计模式之一.简单工厂
蜀道之难.难于上青天,侧身西望长咨嗟 --蜀道难 设计模式第一篇,简单工厂. 定义Operation类 package cn.no1.simplefactory; public abstract cl ...
- 0040 Java学习笔记-多线程-线程run()方法中的异常
run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...
- Java学习笔记——设计模式之二.策略模式
明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...
- 1.8(java学习笔记)继承与方法的重写
继承 在java中可以通过继承提高代码的复用率. 例如A继承了B,就可以是 例如,首先有一个类似Person,这个类中有有一些属性和方法,我们再新建一个Student类,其中有一部分属性和方法与Per ...
- Java学习笔记(六)——方法
一.方法定义 1.语法: 其中: (1) 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.private 甚至可以省略 ,其中 public 表示该方法可以被其他任何 ...
- 疯狂java学习笔记之面向对象(三) - 方法所属性和值传递
方法的所属性: 从语法的角度来看:方法必须定义在类中 方法要么属于类本身(static修饰),要么属于实例 -- 到底是属于类还是属于对象? 有无static修饰 调用方法时:必须有主调对象(主语,调 ...
随机推荐
- Redis数据迁移方案
场景 Redis实例A ---> Redis实例B,整库全量迁移 方案一: mac环境 brew install npm npm install redis-dump -g 针对RedisA: ...
- 使用 ipdb 调试 Python
1.安装 pip install ipdb 2.使用 python -m ipdb xxx.py 程序内部: from ipdb import set_trace set_trace() 3.常用命令 ...
- maven工程莫名其妙只在项目名称那里有一个红叉
manven工程里面没有报错的地方,编译也没有问题,只是项目名称那里有一个红叉. 解决办法: 右击项目-->maven-->update project 注意: 这种方法有时可 ...
- 【笔记】归纳js getcomputedStyle, currentStyle 以及其相关用法
好吧,鉴于前端则个行业知识宽度广而深,早期看过高程介绍过的获取元素计算后的最终样式(浏览器显示的最终样式)的方法现在也忘得七七八八了 于是百度了一下,看了一下大神张鑫旭的博客,这里写个随笔记录一下 ...
- Linux开机启动(bootstrap)下
init process (根据boot loader的选项,Linux此时可以进入单用户模式(single user mode).在此模式下,初始脚本还没有开始执行,我们可以检测并修复计算机可能存在 ...
- Java排序算法之插入排序
基本过程: 每次将待排元素和已经排序好的序列进行比较,按照大小顺序插入进去,重新构造一个新的有序序列. 插入排序算法有种递归的思想在里面,它由N-1趟排序组成.初始时,只考虑数组下标0处的元素,只有一 ...
- Redis数据类型之字符串String
String类型是Redis中最基本也最简单的一种数据类型 首先演示一些常用的命令 一.SET key value 和GET key SET key value 和 GET key 设置键值和获取值 ...
- JavaScript运算符优先级
图片引用自:http://www.cnblogs.com/xxcanghai/p/5189353.html
- iOS图片填充UIImageView(contentMode)
本文主要形象的介绍一下UIView的contentMode属性: 核心代码 [self.prp_imageView setContentMode:UIViewContentModeScaleAspec ...
- [Linux] PHP程序员玩转Linux系列-使用supervisor实现守护进程
1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...