工厂方法模式

工厂方法设计模式

工厂方法设计模式的定义

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.由于考虑到系统的可拓展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时需要考虑多种技术,增加了系统的实现难度;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容