工厂方法设计模式
工厂方法设计模式的定义
1.定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类
工厂方法设计模式结构图
image.png
工厂方法设计模式的具体实现
代码结构:
image.png
调用关系:
image.png
1.新建一个定义工厂方法所创建的抽象对象或接口
package org.example.factory;
/**
* @author yangzhenhua
* @date 2021/3/15 16:11
**/
package org.example.factory;
/**
* @author
* @date 2021/3/15 16:11
**/
public abstract class Operation {
private Double numberA;
private Double numberB;
public abstract Double getResult();
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;
}
}
2.创建一个工厂方法,该方法返回抽象对象
package org.example.factory;
/**
* @author
* @date 2021/3/15 16:15
**/
public interface OperationFactory {
Operation createOperation();
}
3.新建具体的操作对象
public class OperationAdd extends Operation {
@Override
public Double getResult() {
return this.getNumberA()+this.getNumberB();
}
}
public class OperationSub extends Operation {
@Override
public Double getResult() {
return this.getNumberA()-this.getNumberB();
}
}
public class OperationMul extends Operation{
@Override
public Double getResult() {
return this.getNumberA()*this.getNumberB();
}
}
public class OperationDiv extends Operation{
@Override
public Double getResult() {
if (this.getNumberB()==0){
throw new RuntimeException();
}
return this.getNumberA()/this.getNumberB();
}
}
4.新建具体的工厂对象对应具体的操作对象
public class OperationAddFactory implements OperationFactory{
@Override
public Operation createOperation() {
return new OperationAdd();
}
}
public class OperationSub extends Operation {
@Override
public Double getResult() {
return this.getNumberA()-this.getNumberB();
}
}
public class OperationMulFactory implements OperationFactory {
@Override
public Operation createOperation() {
return new OperationMul();
}
}
public class OperationDivFactory implements OperationFactory {
@Override
public Operation createOperation() {
return new OperationDiv();
}
}
5.客户端调用
public class Test {
public static void main(String[] args) {
OperationFactory operationFactory = new OperationAddFactory();
Operation operation = operationFactory.createOperation();
operation.setNumberA(1.2);
operation.setNumberB(1.2);
Double result = operation.getResult();
System.out.println("result:"+result);
}
}
6.运行结果
image.png
工厂方法模式的优缺点
优点
1.更符合开闭原则:新增一种产品时只需要新增具体的产品和产品工厂即可
2.符合单一职责原则:每个工厂类只负责创建对应的产品
3.不适用静态方法可以形成基于继承的等级结构
总结:工厂方法模式可以说是简单工厂模式的进一步总结和拓展,在保留简单工厂封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现
缺点
1.添加新产品时除了新增产品类外,还需新增产品工厂,系统类的个数将相对增加,在一定程度上增加了系统的复杂性,同时有更多的类需要编译和运行,会给系统带来额外的开销
2.由于考虑到系统的可拓展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时需要考虑多种技术,增加了系统的实现难度;