简单工厂模式(Simple Factory Model),又叫做静态工厂方法模式(Static Factory Method Model),属于创建型模式(也就是用于创建实例对象)。
简单工厂模式包括了以下三个部分:
PS:因为该模式不符合开闭原则所以不属于23种GoF设计模式之一。
example:实现一个计算器可以对两个数字进行加减乘除运算! 细细一想很快就可以大致构造出自己的代码来: 这就是计算器 1.0 版本
/**
* @author WQ
*/
public class Operation {
/**
* 进行计算器逻辑计算的方法
*/
public static double result(double num1,double num2,String operate) {
switch (operate) {
case "+":
return num1 + num2;
case "-":
return num1 - num2;
case "*":
return num1 * num2;
case "/":
return num1 / num2;
default:
System.out.println("输入数字或运算符号有误!");
break;
}
return 0.00000000;//仅仅是自定义的表示错误的标识
}
/**
* 测试
*/
public static void main(String[] args) {
double num1 = 0, num2 = 0, result = 0;
String operate = null;
//数据接收
Scanner input = new Scanner(System.in);
System.out.println("请数入第一个数字:");
num1 = input.nextDouble();
System.out.println("请输入进行运算的算法符号(+,-,*,/):");
operate = input.next();
System.out.println("请数入第二个数字:");
num2 = input.nextDouble();
//数据计算
result = result(num1,num2,operate);
System.out.println("数据计算结果为:" + result);
}
}
但是呢,这个代码看起来太挤了,而且和面向对象似乎有点不搭边啊!对于面向对象的三大特性封装,继承,多态好像都没有使用到,而且我们也没有使用到简单工厂模式啊! 于是,我们需要对这段代码进行装饰!
我们首先明确一下对于简单工厂模式来说的三个部分属性:
计算器 1.0 版本代码挤在了一起看起来太过于冗杂也不易于扩展,复用,所以我们有必要将其升级为 计算器 2.0 版本
首先我们可以大致规划一下基本的结构:
UML图 接着我们就开始搭建我们的工厂让它开始生产产品! 计算器的搭建: PS:这里的抽象父类可以是抽象类也可以是一个接口!此例子用抽象类实现!
/**
* @author WQ
* 计算器抽象父类
*/
public abstract class Operation {
private double num1 = 0;
private double num2 = 0;
public abstract double result();
/*对于num1,num2成员变量的getter与setter方法省略!*/
}
/**
* @author WQ
* 加法运算部分
*/
public class Add extends Operation{
@Override
public double result() {
return getNum1() + getNum2();
}
}
/**
* @author WQ
* 减法运算部分
*/
public class Substract extends Operation{
@Override
public double result() {
return getNum1() - getNum2();
}
}
/**
* @author WQ
* 乘法部分
*/
public class Multiply extends Operation {
@Override
public double result() {
return getNum1() * getNum2();
}
}
/**
* @author WQ
* 除法运算部分
*/
public class Divide extends Operation{
@Override
public double result() {
if (getNum2() == 0) {
try {
throw new Exception("除数不可以是0!");
} catch (Exception e) {
e.printStackTrace();
}
}
return getNum1() / getNum2();
}
}
实现了计算器我们就需要搭建工厂了,计算器部分的实现我们用到了封装和继承,而工厂我们就需要使用到多态啦!
/**
* @author WQ
* 简单工厂模式 依据不同的需求创建不同的对象
*/
public class SimpleFactory {
public static Operation create(String operate) {
Operation operation = null;
switch (operate) {
case "+":
operation = new Add();
break;
case "-":
operation = new Substract();
break;
case "*":
operation = new Multiply();
break;
case "/":
operation = new Divide();
break;
default:
try {
throw new Exception("输入的运算符号不存在!");
} catch (Exception e) {
e.printStackTrace();
}
}
return operation;
}
}
给出测试的代码:
/**
* 对简单工厂模式的测试代码
*/
private static void testSimpleFactory() {
com.ww.calculator2.Operation operation = null;
operation = SimpleFactory.create("-");
operation.setNum1(2);
operation.setNum2(0);
System.out.println("运算结果:" + operation.result());
}
给出一个测试结果图
测试结果 计算器 2.0 版本相对于计算器 1.0 版本是不是更加的清楚明了呢?是不是也看着更加高大上呢? 这就是简单工厂模式的介绍啦!
End
本文分享自 MoziInnovations 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!