java编程创建型设计模式工厂方法模式示例详解

 更新时间:2022年02月11日 08:57:36   作者:张起灵-小哥  
这篇文章主要为大家介绍了java编程创建型设计模式之工厂方法模式的创建及案例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助

1.什么是工厂方法模式?

工厂方法模式设计方案:  将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。

工厂方法模式:  定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

何时使用?  不同条件下创建不用实例时。方法是让子类实现工厂接口。

2.案例实现

假如说,我们现在有这样一个需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza、北京的胡椒pizza 或者是 伦敦的奶酪pizza、伦敦的胡椒pizza。披萨的制作有prepare,bake, cut, box;完成披萨店订购功能。

那么可以画一个简单的类图如下:

具体的代码我们就可以这样写:

首先是一个Pizza类,这里将它声明为抽象类,主要原因是其中的prepare方法不是恒定不变的,而是由实现它的子类来完成,也就是说制作披萨的原材料是什么怎么做,我们此时此刻不关心,那么就可以将它延迟到子类中实现。

package com.szh.factory.factorymethod.pizza;
/**
 * 声明Pizza类为抽象类
 */
public abstract class Pizza {
    //Pizza名称
    protected String name;
    //准备原材料,不同的披萨不一样。因此,我们做成抽象方法,具体的原材料实现交给它的子类去完成
    public abstract void prepare();
    //烘烤
    public void bake() {
        System.out.println(name + " baking;");
    }
    //切割
    public void cut() {
        System.out.println(name + " cutting;");
    }
    //打包
    public void box() {
        System.out.println(name + " boxing;");
    }
    public void setName(String name) {
        this.name = name;
    }
}
package com.szh.factory.factorymethod.pizza;
public class BJCheesePizza extends Pizza {
	@Override
	public void prepare() {
		setName("北京的奶酪pizza");
		System.out.println("北京的奶酪pizza 准备原材料");
	}
 
}
package com.szh.factory.factorymethod.pizza;
public class BJPepperPizza extends Pizza {
	@Override
	public void prepare() {
		setName("北京的胡椒pizza");
		System.out.println("北京的胡椒pizza 准备原材料");
	}
 
}
package com.szh.factory.factorymethod.pizza;
public class LDCheesePizza extends Pizza{
	@Override
	public void prepare() {
		setName("伦敦的奶酪pizza");
		System.out.println("伦敦的奶酪pizza 准备原材料");
	}
 
}
package com.szh.factory.factorymethod.pizza;
public class LDPepperPizza extends Pizza{
 	@Override
	public void prepare() {
		setName("伦敦的胡椒pizza");
		System.out.println("伦敦的胡椒pizza 准备原材料");
	}
 
}

下面是订购Pizza的相关代码。

package com.szh.factory.factorymethod.order;
import com.szh.factory.factorymethod.pizza.Pizza;
import java.util.Scanner;
public abstract class OrderPizza {
    //定义一个抽象方法, createPizza, 让各个工厂子类自己实现
    abstract Pizza createPizza(String orderType);
    public OrderPizza() {
        Pizza pizza = null;
        String orderType = "";
        do {
            orderType = getType();
            pizza = createPizza(orderType); //抽象方法, 由工厂子类完成
            // 输出pizza 制作过程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        } while (true);
    }
    private String getType() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入 pizza 种类: ");
        String str = scanner.nextLine();
        return str;
    }
}
package com.szh.factory.factorymethod.order;
import com.szh.factory.factorymethod.pizza.BJCheesePizza;
import com.szh.factory.factorymethod.pizza.BJPepperPizza;
import com.szh.factory.factorymethod.pizza.Pizza;
public class BJOrderPizza extends OrderPizza {
    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if (orderType.equals("cheese")) {
            pizza = new BJCheesePizza();
        } else if (orderType.equals("pepper")) {
            pizza = new BJPepperPizza();
        } else {
            throw new NullPointerException("暂无该Pizza种类....");
        }
        return pizza;
    }
 
}
package com.szh.factory.factorymethod.order;
import com.szh.factory.factorymethod.pizza.*;
public class LDOrderPizza extends OrderPizza {
    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if (orderType.equals("cheese")) {
            pizza = new LDCheesePizza();
        } else if (orderType.equals("pepper")) {
            pizza = new LDPepperPizza();
        } else {
            throw new NullPointerException("暂无该Pizza种类....");
        }
        return pizza;
    }
}

 最后我们测试一下。

package com.szh.factory.factorymethod;
import com.szh.factory.factorymethod.order.BJOrderPizza;
import com.szh.factory.factorymethod.order.LDOrderPizza;
import java.util.Scanner;
public class MainTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String content = scanner.next();
        if (content.equals("Beijing")) {
            new BJOrderPizza();
        } else if (content.equals("London")) {
            new LDOrderPizza();
        } else {
            System.out.println("无法预先匹配Pizza种类....");
            scanner.close();
        }
    }
}

3.JDK中的工厂方法模式

在 java.util.Calendar 这个类中就有。

以上就是java编程创建型设计模式工厂方法模式示例详解的详细内容,更多关于创建型设计模式工厂方法模式的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis的sql语句执行异常后打印到日志问题

    Mybatis的sql语句执行异常后打印到日志问题

    文章介绍了一种Mybatis异常日志打印方案,主要通过Mybatis拦截器获取执行的sql语句,并利用ThreadLocal存储,以避免多线程下的sql语句覆盖问题,当异常发生时,从ThreadLocal中取出sql语句并打印到单独的日志文件中,方便数据恢复,该方案经过压力测试
    2024-10-10
  • Spring Boot中application配置文件的生效顺序及应用范围

    Spring Boot中application配置文件的生效顺序及应用范围

    Spring Boot的一个重要特性就是它的自动配置,这一特性在很大程度上依赖于名称为application的配置文件,本文将详细介绍在Spring Boot中,这些配置文件的加载顺序以及每份文件的应用范围,需要的朋友可以参考下
    2024-03-03
  • Springboot实现发送邮件及注册激活步骤

    Springboot实现发送邮件及注册激活步骤

    为了方便邮件发送功能的使用,我们用邮件发送功能实现用户注册,实现步骤大概就是进行用户注册同时发送一封激活邮件,邮件里附带激活链接,关于Springboot发送邮件注册激活功能的实现参考下本文吧
    2021-06-06
  • SpringBoot中使用Redis Stream实现消息监听示例

    SpringBoot中使用Redis Stream实现消息监听示例

    本文主要介绍了SpringBoot中使用Redis Stream实现消息监听示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 原理分析Java Mybatis中的Mapper

    原理分析Java Mybatis中的Mapper

    这篇文章主要为大家介绍了Java Mybatis中的Mapper,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • SpringBoot集成itext实现html转PDF

    SpringBoot集成itext实现html转PDF

    iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库,本文主要介绍了如何利用itext实现html转PDF,需要的可以参考下
    2024-03-03
  • SpringBoot+Thymeleaf实现生成PDF文档

    SpringBoot+Thymeleaf实现生成PDF文档

    Thymeleaf是一个现代的服务器端 Java 模板引擎,适用于 Web 和独立环境。Thymeleaf 的主要目标是为您的开发工作流程带来优雅的自然模板,本文就来用它实现生成PDF,感兴趣的可以了解一下
    2022-09-09
  • 自定义starter引发的线上事故记录复盘

    自定义starter引发的线上事故记录复盘

    这篇文章主要为大家介绍了自定义starter引发的线上事故记录复盘,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Springboot application.yml配置文件拆分方式

    Springboot application.yml配置文件拆分方式

    这篇文章主要介绍了Springboot application.yml配置文件拆分方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot中Aware接口使用及原理解析

    SpringBoot中Aware接口使用及原理解析

    在Spring中存在一个Aware接口,实现该接口可以让我们的Bean获取到Spring容器中特定的资源,但该接口只是个标记接口,不存在任何方法,本文将给大家详细介绍一下SpringBoot中Aware接口使用及原理,需要的朋友可以参考下
    2023-08-08

最新评论