设计模式-工厂方法模式
上次巩固了简单工厂模式,这次主要记录下工厂模式
一、什么是工厂方法模式
- 工厂方法模式 (Factory Method Pattern),是简单工厂模式的进一步抽象和推广
- 定义了一个用于创建对象的接口,让子类决定实例化哪一个工厂类,使一个类的实例化延迟到其子类
- 遵循了 开放-封闭 原则
- 优点:
- 克服了简单工厂违背开放-封闭原则的缺点
- 封装了对象的创建过程,对于客户端来说,只需要关心接口,而不用关心对象究竟是如何产生的
- 缺点:
- 每增加一个产品,都要相应地加一个工厂类,增加了额外的开发量
二、工厂方法模式UML图
三、工厂方法模式示例
运算方法抽象类
/**
* @Title: Operation.java
* @Description: 运算方法抽象类
* @Author: xj
* @Date: 2018/8/11 9:37
*/
public abstract class Operation {
public abstract double getResult(double numberA, double numberB) throws Exception;
}
运算方法具体实现
/**
* @Title: OperationAdd.java
* @Description: 加法类
* @Author: xj
* @Date: 2018/8/11 9:40
*/
public class OperationAdd extends Operation {
@Override
public double getResult(double numberA, double numberB) {
return numberA + numberB;
}
}
/**
* @Title: OperationSub.java
* @Description: 减法类
* @Author: xj
* @Date: 2018/8/11 9:44
*/
public class OperationSub extends Operation {
@Override
public double getResult(double numberA, double numberB) {
return numberA - numberB;
}
}
/**
* @Title: OperationMul.java
* @Description: 乘法类
* @Author: xj
* @Date: 2018/8/18 14:26
*/
public class OperationMul extends Operation {
@Override
public double getResult(double numberA, double numberB) {
return numberA * numberB;
}
}
/**
* @Title: OperationDiv.java
* @Description: 除法类
* @Author: xj
* @Date: 2018/8/18 14:27
*/
public class OperationDiv extends Operation {
@Override
public double getResult(double numberA, double numberB) throws Exception {
if (numberB == 0) {
throw new Exception("除数不能为0");
}
return numberA / numberB;
}
}
运算方法工厂接口
/**
* @Title: IFactory.java
* @Description: 工厂接口
* @Author: xj
* @Date: 2018/8/19 9:05
*/
public interface IFactory {
Operation getOperation();
}
运算方法工厂具体实现
/**
* @Title: AddFactory.java
* @Description: 加法工厂类
* @Author: xj
* @Date: 2018/8/19 9:08
*/
public class AddFactory implements IFactory {
@Override
public Operation getOperation() {
return new OperationAdd();
}
}
/**
* @Title: SubFactory.java
* @Description: 减法工厂类
* @Author: xj
* @Date: 2018/8/19 9:09
*/
public class SubFactory implements IFactory {
@Override
public Operation getOperation() {
return new OperationSub();
}
}
/**
* @Title: MulFactory.java
* @Description: 乘法工厂类
* @Author: xj
* @Date: 2018/8/19 9:10
*/
public class MulFactory implements IFactory {
@Override
public Operation getOperation() {
return new OperationMul();
}
}
/**
* @Title: DivFactory.java
* @Description: 除法工厂类
* @Author: xj
* @Date: 2018/8/19 9:11
*/
public class DivFactory implements IFactory {
@Override
public Operation getOperation() {
return new OperationDiv();
}
}
测试类
/**
* @Title: Test.java
* @Description: 测试类
* @Author: xj
* @Date: 2018/8/19 9:12
*/
public class Test {
public static void main(String[] args) throws Exception {
IFactory addFactory = new AddFactory();
Operation operationAdd = addFactory.getOperation();
double result1 = operationAdd.getResult(20, 5); // 25.0
System.out.println(result1);
IFactory subFactory = new SubFactory();
Operation operationSub = subFactory.getOperation();
double result2 = operationSub.getResult(20, 5); // 15.0
System.out.println(result2);
IFactory mulFactory = new MulFactory();
Operation operationMul = mulFactory.getOperation();
double result3 = operationMul.getResult(20, 5); // 100.0
System.out.println(result3);
IFactory divFactory = new DivFactory();
Operation operationDiv = divFactory.getOperation();
double result4 = operationDiv.getResult(20, 5); // 4.0
System.out.println(result4);
}
}
以上就是工厂方法模式的一个小例子

浙公网安备 33010602011771号