欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

大话设计模式笔记(六)の工厂方法模式

程序员文章站 2023-01-13 11:12:17
栗子回顾 简单工厂模式: "https://www.cnblogs.com/call me devil/p/10926633.html" 运算类使用工厂方法模式实现 UML图 代码实现 工厂接口 运算基础类 为节省篇章,详见 "简单工厂模式" ,此处省略。 以下加减乘除运算类(OperationAd ......

栗子回顾

简单工厂模式:

运算类使用工厂方法模式实现

uml图

大话设计模式笔记(六)の工厂方法模式

代码实现

工厂接口

/**
 * 工厂接口
 * created by callmedevil on 2019/7/7.
 */
public interface ifactory {
    /**
     * 创建运算类
     *
     * @return
     */
    baseoperation createopertaion();
}

运算基础类

为节省篇章,详见,此处省略。
以下加减乘除运算类(operationadd、operationsub、operationmul、operationdiv)同。

加法工厂

/**
 * 加法工厂
 * created by callmedevil on 2019/7/7.
 */
public class addfactory implements ifactory{

    @override
    public baseoperation createopertaion() {
        return new operationadd();
    }

}

减法工厂

/**
 * 减法工厂
 * created by callmedevil on 2019/7/7.
 */
public class subfactory implements ifactory {

    @override
    public baseoperation createopertaion() {
        return new operationsub();
    }

}

乘法工厂

/**
 * 乘法工厂
 * created by callmedevil on 2019/7/7.
 */
public class mulfactory implements ifactory{

    @override
    public baseoperation createopertaion() {
        return new operationmul();
    }

}

除法工厂

/**
 * 除法工厂
 * created by callmedevil on 2019/7/7.
 */
public class divfactory implements ifactory{

    @override
    public baseoperation createopertaion() {
        return new operationdiv();
    }

}

测试

/**
 * 工厂方法模式测试
 * created by callmedevil on 2019/7/7.
 */
public class test {

    public static void main(string[] args) {
        ifactory operfactory = new addfactory();
        baseoperation oper = operfactory.createopertaion();
        oper.setnuma(1);
        oper.setnumb(2);
        double result = oper.getresult();
        system.out.println("加法测试结果:" + result);
    }

}

测试结果

加法测试结果:3.0

工厂方法模式

与简单工厂比较

简单工厂模式的最大优点在于工厂类中,包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

结构图

大话设计模式笔记(六)の工厂方法模式

总结

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码进行。你想要加功能,本来是改工厂类的,而现在是修改客户端。