设计模式-工厂方法模式学习笔记

工厂方法模式

  • 定义

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。


  • 优缺点

优点:

  1. 相比简单工厂方法模式,工厂方法模式对修改不在开放,满足了开闭原则(工厂类抽象成了父类,判断创建对象的代码放到了客户端)

缺点:

  1. 一种对象对应一个工厂,类的数量增加了,程序变得复杂

  • 特点
  1. 抽象出一个工厂父类
  2. 工厂子类new出具体产品对象,并返回
  3. 新增具体产品对象时,对应新增工厂子类

  • 结构

Creator:工厂父类,返回一个产品父类的对象

ConcreteCreator:工厂子类,返回一个具体产品类的对象

Product:产品父类,工厂创建对象的父类

ConcreteProduct:具体的产品类,被工厂创建的类


  • 代码

例子:计算器

类图:

工厂父类

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/15 0:59
 * @ Description:工厂父类
 */
public interface Creator {
    Operation createOperation();
}

  

工厂子类

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/15 1:00
 * @ Description:加法工厂
 */
public class AddFactory implements Creator{
    @Override
    public Operation createOperation() {
        System.out.println("加法运算");
        return new Add();
    }
}

  

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/15 1:06
 * @ Description:除法工厂
 */
public class DivideFactory implements Creator{
    @Override
    public Operation createOperation() {
        System.out.println("除法运算");
        return new Divide();
    }
}

  

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/15 1:08
 * @ Description:乘法工厂
 */
public class MultiplyFactory implements Creator {
    @Override
    public Operation createOperation() {
        System.out.println("乘法运算");
        return new Multiply();
    }
}

  

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/15 1:09
 * @ Description:减法工厂
 */
public class SubtractFactory implements Creator{
    @Override
    public Operation createOperation() {
        System.out.println("减法运算");
        return new Subtract();
    }
}

  

产品对象父类(算法父类)

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/15 1:02
 * @ Description:算法父类
 */
public interface Operation {
    Double getResult(Double num1,Double num2);
}

  

具体产品对象类(算法子类)

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/15 1:01
 * @ Description:加法算法
 */
public class Add implements Operation{
    @Override
    public Double getResult(Double num1, Double num2) {
        return num1 + num2;
    }
}

  

public class Divide implements Operation{
    @Override
    public Double getResult(Double num1, Double num2) {
        return num1 / num2;
    }
}

  

public class Multiply implements Operation{
    @Override
    public Double getResult(Double num1, Double num2) {
        return num1 * num2;
    }
}

  

public class Subtract implements Operation{
    @Override
    public Double getResult(Double num1, Double num2) {
        return num1 - num2;
    }
}

  客户端调用类

/**
 * @ Author     :fonxi
 * @ Date       :2019/5/15 0:50
 * @ Description:客户端调用类
 */
public class TestController {
    public void print(){
        try {
            Scanner s = new Scanner(System.in) ;
            System.out.println("请输入第一个数字");
            Double num1 = s.nextDouble();

            System.out.println("请输入第二个数字");
            Double num2 = s.nextDouble();

            System.out.println("请输入运算");
            String operator = s.next();
            Operation operation ;
            Creator creator = null;

            try{
                switch (operator){
                    case "+":
                        creator = new AddFactory();
                        break;
                    case "-":
                        creator = new SubtractFactory();
                        break;
                    case "*":
                        creator = new MultiplyFactory();
                        break;
                    case "/":
                        creator = new DivideFactory();
                        break;
                    default:
                        System.out.println("输入运算符有误");
                        break;
                }
            }catch (Exception e){
                System.out.println("输入有误"+e.getMessage());
            }
            operation = creator.createOperation();

            System.out.println("运算结果:"+operation.getResult(num1,num2));
        }catch (Exception e){
            System.out.println("输入有误"+e.getMessage());
        }
    }
}

  运算结果

请输入第一个数字
80
请输入第二个数字
3
请输入运算
/
除法运算
运算结果:26.666666666666668

  


  • 总结

工厂方法模式又称工厂模式,23种设计模式的一种,属于创建型模式,它保持了简单工厂模式的优点,又克服了简单工厂模式的缺点,但是在一定程度上增加了程序的复杂度。

(0)

相关推荐

  • 【重温设计模式】之004抽象工厂模式

    [重温设计模式系列源码] 抽象工厂模式 基本原理 含义 抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口, 而无须指定它们具体的类:具体的工 ...

  • 无废话设计模式(12)行为型模式--模板方法模式

    0-前言 模板方法模式定义:定义一个操作中的算法骨架,而将一些步骤延迟到子类中: 模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些步骤: 1-实现 1-1.简单UML图:  1-2 ...

  • 设计模式-行为型-模板模式

    模板模式(Template): 提到模板,可能大多数人想到的是"简历模板"."论文模板"等,比如我们要写简历时,会从网上下载一份漂亮的简历模板,其格式是固定的, ...

  • 设计模式 | 工厂方法模式(factory method)

    定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 结构:(书中图,侵删) 一个工厂的抽象接口 若干个具体的工厂类 一个需要创建对象的抽象接口 若干个 ...

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

    栗子回顾 简单工厂模式: https://www.cnblogs.com/call-me-devil/p/10926633.html 运算类使用工厂方法模式实现 UML图 代码实现 工厂接口 /** ...

  • PHP设计模式之工厂方法模式

    PHP设计模式之工厂方法模式 上回说到,简单工厂不属于GoF的二十三种设计模式,这回可就来真家伙了,大名顶顶的工厂方法模式前来报道! GoF类图解释 工厂方法模式对比简单工厂来说,最核心的一点,其实就 ...

  • [PHP小课堂]PHP设计模式之工厂方法模式

    [PHP小课堂]PHP设计模式之工厂方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式(1) 工厂方法模式

    创建型模式 简单工厂模式 工厂方法模式 IOC与工厂方法模式的结合 泛型工厂 委托工厂 创建型模式 创建型模式可以隔离客户程序对需要实例化类型的依赖关系,这类模式一般通过将实例化具体对象的职责委托给第 ...

  • 【设计模式】工厂方法模式

    定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类 优缺点 优点 针对简单工厂不容易扩展,工厂方法将实例化延迟到子类工厂,从而提供扩展 缺点 每次新增产品 ...

  • 【设计模式】工厂方法模式(Factory Method)

    工厂方法模式(Factory Method) 工厂方法模式分为三种: 1.普通工厂模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.首先看下关系图:举例如下:(我们举一个发送邮件和短信 ...

  • 【7/25】使用工厂方法模式(Factory Method Pattern)创建Page页面对象

    这是<小游戏从0到1设计模式重构>系列内容第7篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 看完三姐妹中的简单工厂模式,再 ...

  • 设计模式----------工厂(Factory)模式

    作用 实现了创建者和调用者分离. 工厂模式核心/本质: 实例化对象不在使用new,而是用工厂方法代替. 将选择实现类,创建对象统一管理和控制,从而实现调用者和我们实现类解耦 工厂模式详细分类 1.简单 ...