工厂模式的三种实现方式

文章目录

    • 1.引出工厂模式
        • 具体需求
    • 2.传统模式
        • 1.类图
        • 2.目录结构
        • 3.pizzastore 用于设计pizza
          • 1.Pizza.java 抽象的Pizza类型
          • 2.CheesePizaa.java CheesePizaa
          • 3.GreekPizza.java GreekPizza
        • 4.order 用于订购和制作pizza
          • 1.OrderPizza.java 制作pizza
          • 2.PizzaStore.java 订购pizza
        • 5.优缺点分析
    • 3.简单工厂模式
        • 1.基本介绍
        • 2.类图
        • 3.目录结构
        • 4.orderbysimplefactory
          • 1.SimpleFactory.java 简单工厂,根据类型来创建对象
          • 2.OrderPizzaBySimpleFactory.java 聚合一个工厂,来得到对象
          • 3.PizzaStoreBySimpleFactory.java 订购pizza
        • 5.pizzastore 用于设计pizza跟上面的一样
        • 6.简单工厂模式的小结
    • 4.工厂方法模式
        • 1.具体需求引入工厂方法模式
        • 2.基本介绍
        • 3.类图
        • 4.目录结构
        • 5.pizzastore 设置pizza
          • 1.Pizza.java 抽象的Pizza类型
          • 2.BJCheesePizza.java
          • 3.BJPepperPizza.java
          • 4.LDCheesePizza.java
          • 5.LDPepperPizza.java
        • 6.order 制作pizza
          • 1.OrderPizza.java 制作Pizza的抽象类
          • 2.BJOrderPizza.java 根据不同的类型创建不同类型的BJpizza
          • 3.LDOrderPizza.java 根据不同的类型创建不同类型的LDpizza
          • 4.PizzaStore.java 订购pizza
        • 7.工厂方法模式小结
    • 5.抽象工厂模式
        • 1.基本介绍
        • 2.类图
        • 3.目录结构
        • 4.order
          • 1.AbsFactory.java 抽象工厂
          • 2.BJFactory.java 北京的具体工厂
          • 3.LDFactory.java 伦敦的具体工厂
          • 4.OrderPizza.java 根据不同的具体工厂,和类型来制造对应的pizza
          • 5.PizzaStore.java 订购pizza
    • 6.JDK源码分析
        • 1.Calendar类使用了简单工厂模式
        • 2.工厂模式小结

1.引出工厂模式

具体需求

image-20240527144734628

2.传统模式

1.类图

image-20240527155602819

2.目录结构

3.pizzastore 用于设计pizza
1.Pizza.java 抽象的Pizza类型
package com.sun.simplefactory.pizzastore;/*** Description: 抽象的Pizza类型* @Author sun* @Create 2024/5/27 15:02* @Version 1.0*/
public abstract class 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;}
}
2.CheesePizaa.java CheesePizaa
package com.sun.simplefactory.pizzastore;/*** Description: CheesePizaa* @Author sun* @Create 2024/5/27 15:07* @Version 1.0*/
public class CheesePizaa extends Pizza {@Overridepublic void prepare() {System.out.println("CheesePizaa preparing;");}
}
3.GreekPizza.java GreekPizza
package com.sun.simplefactory.pizzastore;/*** Description: GreekPizza* @Author sun* @Create 2024/5/27 15:07* @Version 1.0*/
public class GreekPizza extends Pizza{@Overridepublic void prepare() {System.out.println("GreekPizza preparing;");}
}
4.order 用于订购和制作pizza
1.OrderPizza.java 制作pizza
package com.sun.simplefactory.order;import com.sun.simplefactory.pizzastore.CheesePizaa;
import com.sun.simplefactory.pizzastore.GreekPizza;
import com.sun.simplefactory.pizzastore.Pizza;/*** Description: 制作pizza* @Author sun* @Create 2024/5/27 15:08* @Version 1.0*/
public class OrderPizza {// 根据用户的输入,返回对应的Pizza对象,获取用户的输入public void createPizza(String orderType) {Pizza pizza = null;if (orderType.equals("greek")) {pizza = new GreekPizza();pizza.setName("GreekPizza");} else if (orderType.equals("cheese")) {pizza = new CheesePizaa();pizza.setName("CheesePizaa");}// 输出pizza制作过程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}
}
2.PizzaStore.java 订购pizza
package com.sun.simplefactory.order;/*** Description: 订购pizza* @Author sun* @Create 2024/5/27 15:50* @Version 1.0*/
public class PizzaStore {public static void main(String[] args) {// 订购pizza,相当于客户端new OrderPizza().createPizza("greek");}
}
5.优缺点分析

image-20240527161644288

image-20240527160552499

image-20240527160715562

3.简单工厂模式

1.基本介绍

image-20240527161004877

2.类图

image-20240527170514320

3.目录结构

image-20240527170721606

4.orderbysimplefactory
1.SimpleFactory.java 简单工厂,根据类型来创建对象
package com.sun.simplefactory.orderbysimplefactory;import com.sun.simplefactory.pizzastore.CheesePizaa;
import com.sun.simplefactory.pizzastore.GreekPizza;
import com.sun.simplefactory.pizzastore.Pizza;/*** Description: 简单工厂模式* @Author sun* @Create 2024/5/27 16:18* @Version 1.0*/
public class SimpleFactory {Pizza pizza = null;public Pizza createPizza(String orderType) {System.out.println("使用简单工厂模式");// 根据用户输入的类型来获取Pizza对象if (orderType.equals("greek")) {pizza = new GreekPizza();pizza.setName("GreekPizza");} else if (orderType.equals("cheese")) {pizza = new CheesePizaa();pizza.setName("CheesePizaa");}return pizza;}
}
2.OrderPizzaBySimpleFactory.java 聚合一个工厂,来得到对象
package com.sun.simplefactory.orderbysimplefactory;import com.sun.simplefactory.pizzastore.Pizza;/*** Description: 通过简单工厂来订购pizza* @Author sun* @Create 2024/5/27 16:39* @Version 1.0*/
public class OrderPizzaBySimpleFactory {// 定义一个简单工厂的属性private SimpleFactory simpleFactory;// 使用构造器创建一个对象并注入工厂public OrderPizzaBySimpleFactory(SimpleFactory simpleFactory) {setSimpleFactory(simpleFactory);}// 使用set方法聚合一个pizza的工厂public void setSimpleFactory(SimpleFactory simpleFactory) {this.simpleFactory = simpleFactory;// 记录用户输入的pizza类型String orderType = "greek";// 根据用户输入的类型,从工厂中获取一个该类型的pizzaPizza pizza = simpleFactory.createPizza(orderType);// 判断是否获取到了指定类型的pizzaif (pizza != null) {// 输出pizza制作过程pizza.prepare();pizza.bake();pizza.cut();pizza.box();} else {System.out.println("订购pizza失败!");}}
}
3.PizzaStoreBySimpleFactory.java 订购pizza
package com.sun.simplefactory.orderbysimplefactory;/*** Description:* @Author sun* @Create 2024/5/27 15:50* @Version 1.0*/
public class PizzaStoreBySimpleFactory {public static void main(String[] args) {// 订购pizza,相当于客户端new OrderPizzaBySimpleFactory(new SimpleFactory());}
}
5.pizzastore 用于设计pizza跟上面的一样
6.简单工厂模式的小结

需要根据类型的不同来创建不同的对象时,可将其做成一个简单工厂

4.工厂方法模式

1.具体需求引入工厂方法模式

image-20240527183206377

2.基本介绍

image-20240527183303460

3.类图

image-20240527184246448

4.目录结构

image-20240527195350891

5.pizzastore 设置pizza
1.Pizza.java 抽象的Pizza类型
package com.sun.factorymethod.pizzastore;/*** Description: 抽象的Pizza类型* @Author sun* @Create 2024/5/27 15:02* @Version 1.0*/
public abstract class 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;}
}
2.BJCheesePizza.java
package com.sun.factorymethod.pizzastore;/*** Description:* @Author sun* @Create 2024/5/27 19:13* @Version 1.0*/
public class BJCheesePizza extends Pizza{@Overridepublic void prepare() {super.setName("北京的奶酪pizza");System.out.println("北京的奶酪pizza 准备原材料");}
}
3.BJPepperPizza.java
package com.sun.factorymethod.pizzastore;/*** Description:* @Author sun* @Create 2024/5/27 19:16* @Version 1.0*/
public class BJPepperPizza extends Pizza{@Overridepublic void prepare() {super.setName("北京的胡椒pizza");System.out.println("北京的胡椒pizza 准备原材料");}
}
4.LDCheesePizza.java
package com.sun.factorymethod.pizzastore;/*** Description:* @Author sun* @Create 2024/5/27 19:13* @Version 1.0*/
public class LDCheesePizza extends Pizza{@Overridepublic void prepare() {super.setName("伦敦的奶酪pizza");System.out.println("伦敦的奶酪pizza 准备原材料");}
}
5.LDPepperPizza.java
package com.sun.factorymethod.pizzastore;/*** Description:* @Author sun* @Create 2024/5/27 19:16* @Version 1.0*/
public class LDPepperPizza extends Pizza{@Overridepublic void prepare() {super.setName("伦敦的胡椒pizza");System.out.println("伦敦的胡椒pizza 准备原材料");}
}
6.order 制作pizza
1.OrderPizza.java 制作Pizza的抽象类
package com.sun.factorymethod.order;import com.sun.factorymethod.pizzastore.Pizza;/*** Description: 制作Pizza的抽象类* @Author sun* @Create 2024/5/27 19:21* @Version 1.0*/
public abstract class OrderPizza {abstract Pizza createPizza(String orderType);// 构造方法,当子类创建对象的时候就会调用public OrderPizza() {Pizza pizza = null;// 订单的类型,子类根据订单的类型来创建订单String orderType = "cheese";pizza = this.createPizza(orderType);// 输出pizza的制作过程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}
}
2.BJOrderPizza.java 根据不同的类型创建不同类型的BJpizza
package com.sun.factorymethod.order;import com.sun.factorymethod.pizzastore.BJCheesePizza;
import com.sun.factorymethod.pizzastore.BJPepperPizza;
import com.sun.factorymethod.pizzastore.Pizza;/*** Description:* @Author sun* @Create 2024/5/27 19:35* @Version 1.0*/
public class BJOrderPizza extends OrderPizza{@OverridePizza createPizza(String orderType) {// 根据不同的类型创建不同类型的pizzaPizza pizza = null;if ("cheese".equals(orderType)) {pizza = new BJCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new BJPepperPizza();}return pizza;}
}
3.LDOrderPizza.java 根据不同的类型创建不同类型的LDpizza
package com.sun.factorymethod.order;import com.sun.factorymethod.pizzastore.*;/*** Description:* @Author sun* @Create 2024/5/27 19:35* @Version 1.0*/
public class LDOrderPizza extends OrderPizza{@OverridePizza createPizza(String orderType) {// 根据不同的类型创建不同类型的pizzaPizza pizza = null;if ("cheese".equals(orderType)) {pizza = new LDCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new LDPepperPizza();}return pizza;}
}
4.PizzaStore.java 订购pizza
package com.sun.factorymethod.order;/*** Description:* @Author sun* @Create 2024/5/27 19:48* @Version 1.0*/
public class PizzaStore {public static void main(String[] args) {// 创建北京口味的pizzaBJOrderPizza bjOrderPizza = new BJOrderPizza();// 创建伦敦口味的pizzaLDOrderPizza ldOrderPizza = new LDOrderPizza();}
}
7.工厂方法模式小结

每个方法都相当于一个工厂,能够根据不同类型创建不同的对象,这里还结合了模板方法模式,当子类创建对象,会调用父类的构造器,而构造器内根据类型调用子类创建pizza的方法

5.抽象工厂模式

1.基本介绍

image-20240527200354850

2.类图

image-20240527201557422

3.目录结构

image-20240527204234481

4.order
1.AbsFactory.java 抽象工厂
package com.sun.absfactory.order;import com.sun.factorymethod.pizzastore.Pizza;/*** Description: 抽象工厂* @Author sun* @Create 2024/5/27 20:20* @Version 1.0*/
public interface AbsFactory {Pizza createPizza(String orderType);
}
2.BJFactory.java 北京的具体工厂
package com.sun.absfactory.order;import com.sun.factorymethod.pizzastore.*;/*** Description:* @Author sun* @Create 2024/5/27 20:22* @Version 1.0*/
public class BJFactory implements AbsFactory{@Overridepublic Pizza createPizza(String orderType) {// 根据不同的类型创建不同类型的BJpizzaPizza pizza = null;if ("cheese".equals(orderType)) {pizza = new BJCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new BJPepperPizza();}return pizza;}
}
3.LDFactory.java 伦敦的具体工厂
package com.sun.absfactory.order;import com.sun.factorymethod.pizzastore.LDCheesePizza;
import com.sun.factorymethod.pizzastore.LDPepperPizza;
import com.sun.factorymethod.pizzastore.Pizza;/*** Description:* @Author sun* @Create 2024/5/27 20:22* @Version 1.0*/
public class LDFactory implements AbsFactory {@Overridepublic Pizza createPizza(String orderType) {// 根据不同的类型创建不同类型的LDpizzaPizza pizza = null;if ("cheese".equals(orderType)) {pizza = new LDCheesePizza();} else if ("pepper".equals(orderType)) {pizza = new LDPepperPizza();}return pizza;}
}
4.OrderPizza.java 根据不同的具体工厂,和类型来制造对应的pizza
package com.sun.absfactory.order;import com.sun.factorymethod.pizzastore.Pizza;/*** Description:* @Author sun* @Create 2024/5/27 20:26* @Version 1.0*/
public class OrderPizza {// 聚合一个抽象工厂private AbsFactory absFactory;// 通过构造器再聚合一下public OrderPizza(AbsFactory absFactory) {this.setAbsFactory(absFactory);}public void setAbsFactory(AbsFactory absFactory) {this.absFactory = absFactory;Pizza pizza = null;// 订单的类型,子类根据订单的类型来创建订单String orderType = "cheese";pizza = absFactory.createPizza(orderType);// 输出pizza的制作过程pizza.prepare();pizza.bake();pizza.cut();pizza.box();}
}
5.PizzaStore.java 订购pizza
package com.sun.absfactory.order;/*** Description:* @Author sun* @Create 2024/5/27 20:39* @Version 1.0*/
public class PizzaStore {public static void main(String[] args) {// 使用伦敦的工厂,来订购pizaaOrderPizza orderPizza = new OrderPizza(new LDFactory());}
}

6.JDK源码分析

1.Calendar类使用了简单工厂模式

image-20240527205010032

2.工厂模式小结

image-20240527205959020

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】 关于列表类型

文章目录 🍃前言🍀常见操作命令介绍🚩lpush🚩lpushx🚩rpush🚩rpushx🚩lrange🚩lpop🚩rpop🚩lindex🚩linsert🚩llen🚩lrem&…

“按摩”科技?

都说A股股民是特别善于学习的,这不市场又现新概念——“按摩科技”,成立仅6年,把上门按摩干到35亿营收也是没谁了,现在号称有1000万用户,3万家入驻商户数的按摩平台,难道就凭借2.5万名女技师,活…

【Django】中间件实现钩子函数预处理和后处理,局部装饰视图函数

在app文件夹里新建middleware.py继承MiddlewareMixin, 编写中间件类,重写process_request、process_response钩子函数 from django.http import HttpRequest, HttpResponse from django.utils.decorators import decorator_from_middleware from django…

关于pytest中用例名称使用中文乱码的解决

场景:使用pytest.mark.parametrize装饰器为用例自定义名称时,运行显示乱码。如下图所示: 解决方案: 1.在根目录 pytest.ini中增加一行代码 [pytest] disable_test_id_escaping_and_forfeit_all_rights_to_community_supportTrue…

NAT 网络转换

NAT(Network Address Translation) 网络地址转换 0x01 NAT 简介 为什么要使用 NAT IPv4 网络地址紧缺,从而出现了私有网段,来补充地址,但私有网段不课访问 internet 所以出现了 NAT 地址转换,将私有地址,转换为公网 I…

一口气看完es(上)

此系列博客分为上中下3篇:上篇是关于es的概念和对数据的增删改操作,中篇是对数据的查询、对搜索结果进行处理操作,下篇是介绍怎么在Java代码中调用和操作es。 基本概念 1、es是什么?有什么作用? es全名是elasticsea…

关于0成本部署个人博客

分享一个文章关于零成本搭建个人博客 参考:‘关于部署博客hexoshokagithub的流程以及问题’ - 关于博客部署 | XiaoYang Guo Welcome to Guo Xiaoyangs personal blog 欢迎来到郭晓阳的个人博客 (1330303.github.io) 这个博主讲的流程很全,而且回答也…

智慧管廊巡检运维解决方案

一、智慧管廊巡检行业目前存在的挑战和难题 智慧管廊巡检行业面临着运行环境的客观影响,如地面施工、液体渗漏、通风不佳、内部空间受限等问题。而管廊巡检机器人系统的出现却具有重大意义。它能够有力地保障管廊安全且可靠地运行,在面对火情、灾情等紧…

springboot基础篇(快速入门+要点总结)

目录 一、SpringBoot简介 二、创建SpringBoot(通过Idea脚手架搭建项目) 三、properties配置文件 properties 配置文件说明 ①. properties 基本语法 ②. 读取配置⽂件 ③. properties 缺点 2. yml 配置⽂件说明 ①. yml 基本语法 ②. yml 使用进…

上海AI lab发布MathBench,GPT-4o的数学能力有多强?

大模型数学能力哪家强? 最近,上海AI lab构建了一个全面的多语言数学基准——MathBench。与现有的基准不同的是,MathBench涵盖从小学、初中、高中、大学不同难度,从基础算术题到高阶微积分、统计学、概率论等丰富类别的数学题目&a…

【Linux】升级make(版本4.4.1)、升级gdb(版本14.1)、升级autoconf(版本2.71)

centos7升级make(版本4.4.1): make:编译和构建工具。Linux中很多软件包需要make编译构建。官网:Make - GNU Project - Free Software Foundation 本次升级前的make版本是3.82,准备安装的版本是4.4.1。make…

【Delphi 开箱即用 4】动态切换主题皮肤(明亮 or 暗黑)

Delphi的原始窗口界面看起来并不够吸引人。尝试下载并安装第三方皮肤可能会导致应用程序尺寸急剧增加,并且可能会出现不稳定的情况。事实上,Delphi自带了皮肤功能,完全可以满足我们对窗口界面的美化需求,并且还支持动态切换皮肤。…

Python I/O操作笔记

打开文件: 使用 open() 函数,其中文件路径可以是相对路径或绝对路径。 模式除了常见的 r(只读)、w(写入,会覆盖原有内容)、a(追加)外,还有一些其他组合模式&…

基于springboot实现旅游管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在…

来自Java的“菱形继承“,你听说过吗?

一、菱形继承的概念 菱形继承又叫做钻石继承,指的是不同的类同时继承自相同的父类,存在一个子类同时继承这些不同的类,即我们常说的“多继承”问题。 例如:B类和C类分别继承A类,而D类同时继承B类和C类。 如此图所示 二…

Oladance、韶音、南卡开放式耳机选哪个?2024年主流产品硬核测评!

近期,不少朋友向我咨询关于挑选开放式耳机的建议,希望找到既适合自己又具有高品质的选项。鉴于市场上开放式耳机品牌繁多,每款产品在音质、佩戴感受及整体性能上的表现各有千秋,正确选择一款耳机成为了音乐爱好者们关注的焦点。错…

R绘图学习笔记

1、R语言绘制海岸线边界 参考: Drawing beautiful maps programmatically with R, sf and ggplot2 — Part 1: Basics 使用R绘制世界地图及纬度统计图 Drawing maps with R. A basic tutorial:https://dr2blog.hcommons.org/2020/03/23/drawing-maps-wit…

【408精华知识】指令字长、存储字长、机器字长大总结!

文章目录 一、三种字长二、三种字长之间的关系三、三种字长与部件位数之间的关系 一、三种字长 机器字长:等于字长,CPU一次能够处理的数据的位数。通常等于寄存器、ALU的位数。例子:windows 64位/32位,这里的64位和32位指的就是该…

Pycharm最新安装教程(最新更新时间2024年5月27日)

ps:本教程Pycharm安装,最新更新时间:2024年5月27日,公众号持续更新关注公众号防失联哦 Pycharm 再次更新了一个小版本。又回到老话题,2023.3.2这个版本是否还能安装,笔者也亲测了一下。还是沿用本站之前的…

Livox-SDK2 用vs2017编译

Livox-SDK2 Livox-SDK2代码去上面下载,文章中给出的是用vs2019进行编译的,生成项目时用的 > cmake .. -G "Visual Studio 16 2019" -A x64 但如果我想用vs2017进行编译,那么只需要将上面语句改为如下: cmake .. -…