简单工厂模式
参考大话设计模式中简单工厂模式,以两个数字的加减乘除运算为例来分析简单工厂模式的优缺点
分析思考
1.从分层角度思考,数据计算和数据输入体现在业务处理和业务展示两个层面上,因此不能将两者进行杂糅,封装越发独立越好。
2.程序中不同的地方在于计算方式的不同,所以对如何计算需要进行单独处理,不可能是通用的处理方式。
业务开发
package com.neutron.simple.factroy;
/**
* 操作抽象类
*
* @author neutron
*
*/
public abstract class Operate {
private double numberA;
private double numberB;
/**
* 数字计算方法
*
* @return
*/
public abstract double count();
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getNumberB() {
return numberB;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
@Override
public String toString() {
return "Operate [numberA=" + numberA + ", numberB=" + numberB + "]";
}
}
package com.neutron.simple.factroy;
/**
* 加法操作类
*
* @author neutron
*
*/
public class OperateAdd extends Operate {
@Override
public double count() {
return this.getNumberA() + this.getNumberB();
}
}
package com.neutron.simple.factroy;
/**
* 减法操作类
*
* @author neutron
*
*/
public class OperateSub extends Operate {
@Override
public double count() {
return this.getNumberA() - this.getNumberB();
}
}
package com.neutron.simple.factroy;
/**
* 工厂类
*
* @author neutron
*
*/
public class Factory {
/**
* 获取操作类对象
*
* @param operateMark 操作标识
* @return 操作对象
*/
public static Operate getInstance(String operateMark) {
Operate operate;
switch(operateMark) {
case "+": operate = new OperateAdd();break;
case "-": operate = new OperateSub();break;
default:operate = new OperateAdd();break;
}
return operate;
}
}
/**
* 业务逻辑处理
*
* 简单工厂设计模式
* 1.以两个数据的操作为例
* 2.参考来源:大话设计模式
*
* 简单工厂优缺点总结:
* 1.封装变化,比如操作抽象类,所有的变化都是对数据的操作
* 2.增加可拓展性,符合开闭原则,新增加的业务逻辑只需要继承操作类即可
* 3.工厂类不没有符合开闭原则,但已经将修改范围尽可能缩小。
*
* 思考:
* 和现实生活关联,那么就会减少知识孤岛问题的存在,不会出现出现学会就忘的情况。
* 如果罗马只有几条小道可以通向,那么它注定会被遗忘,但是如果上下入地水路无数条道路可以抵达,
* 那么一定会深刻记忆在脑海中,就会存在何时使用就可以通过几种路径获取该知识。
*/
package com.neutron.simple.factroy;
客户端
package com.neutron.simple.client;
import java.util.Scanner;
import com.neutron.simple.factroy.Factory;
import com.neutron.simple.factroy.Operate;
public class CountClient {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入操作数:");
double numberA = scanner.nextDouble();
System.out.println("请输入操作符号:(+/-)");
String operateMark = scanner.next();
System.out.println("请输入被操作数:");
double numberB = scanner.nextDouble();
scanner.close();
Operate oper = Factory.getInstance(operateMark);
oper.setNumberA(numberA);
oper.setNumberB(numberB);
System.out.println("操作结果是:" + oper.count());
}
/**
* 不足:
* 页面展示逻辑中尽可能不要存在业务处理逻辑
* 此处处在业务处理逻辑,因此此处封装并不是十分到位。
*/
}
/**
* 客户端操作界面
*
* @author neutron
*/
package com.neutron.simple.client;
运行结果
请输入操作数:
1
请输入操作符号:(+/-)
+
请输入被操作数:
1
操作结果是:2.0