java设计模式——FactoryMethod模式

开源AGV调度系统 OpenTCS 5.4 开发环境配置与编译运行 1、OpenTCS项目简介 OpenTCS是一款著名的开源AGV控制软件,具有运输订单管理、运输车辆分配、路由分配和交通管制等完整的调度功能,功能强大,也可用于其他移动设备控制,如机器人、无人机等。 2、OpenTCS项目源码 2.1 项目官网地址为: openTCS - The open transportation control system 2.2 项目Github官方仓库地址为: GitHub - openTCS/opentcs: The open Transportation ... 阅读详情

模式概念

这是工厂模式中比较简单的一种,大致思想和上篇提到的《java设计模式——TemplateMethod模式》 比较像。首先我们看一个图,这个图来自《图解设计模式》一书响应章节:
这里写图片描述
图中,提供了一个生产鱼的模具,然后我们可以使用不同的材料生产颜色,质感不一样的鱼,这个图很好地解释了工厂方法模式。
在Template Method模式中,我们在父类中规定处理流程,在子类中实现具体的细节。如果我们将该模式用于实例的生成,那么它就是Factory Method模式了。
Factory就是工厂的意思,也就是规模化,标准化生产对象实例的地方。用Template Method模式来构建生成的工厂,这就是FactoryMethod模式。
在FactoryMethod模式中,父类决定实例的生成方式,但是不决定需要生成什么类型的实例,具体的处理全部交给子类来负责。这样就可以将生成实例的框架和需要实现的业务细节解耦。

举个例子

我们这里举一个生产id卡的例子,主要用于生产每个人的ID卡。一共有5个类:
AbstractProduct类和AbstractFactory类属于framework包,提供实例生成的框架。
IDCard类和IDCardFactory类是负责实际生产的类,他们在idcard的包下。
Main类是客户端类。
这里涉及的类图如下:
这里写图片描述
代码整体的包结构如下:
这里写图片描述
下面我们看下具体的实现。

AbstractProduct

/*************************************************************************
    > File Name: AbstractProduct.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 10:19:14 2018
 ************************************************************************/
package framework;

public abstract class AbstractProduct {
    public abstract void use();
}

AbstractFactory

/*************************************************************************
    > File Name: AbstractFactory.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 11:52:57 2018
 ************************************************************************/
package framework;

public abstract class AbstractFactory {
    public final AbstractProduct create(String owner) {
        AbstractProduct product = createProduct(owner);
        registerProduct(product);

        return product;
    }

    protected abstract AbstractProduct createProduct(String owner);
    protected abstract void registerProduct(AbstractProduct product);
}

IDCard

/*************************************************************************
    > File Name: IDCard.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 11:56:19 2018
 ************************************************************************/
package idcard;

import framework.*;

public class IDCard extends AbstractProduct {
    private String owner;

    IDCard(String owner) {
        System.out.println("Creating id card, owner: " + owner);
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("Using id card, owner: " + owner);
    }

    public String getOwner() {
        return owner;
    }
}

IDCardFactory

/*************************************************************************
    > File Name: IDCardFactory.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 12:28:07 2018
 ************************************************************************/
package idcard;

import framework.*;
import java.util.List;
import java.util.ArrayList;

public class IDCardFactory extends AbstractFactory {
    private List<String> owners = new ArrayList<>();

    @Override
    protected AbstractProduct createProduct(String owner) {
        return new IDCard(owner);
    }

    @Override
    protected void registerProduct(AbstractProduct product) {
        owners.add(((IDCard) product).getOwner());
    }

    public List<String> getOwners() {
        return owners;
    }
}

Main

/*************************************************************************
    > File Name: Main.java
    > Author: CreateChance
    > Mail: createchance@163.com 
    > Created Time: Thu Mar 15 12:35:22 2018
 ************************************************************************/
import framework.*;
import idcard.*;

public class Main {
    public static void main(String[] argvs) {
        AbstractFactory factory = new IDCardFactory();
        AbstractProduct card1 = factory.create("Tom");
        AbstractProduct card2 = factory.create("Jack");
        AbstractProduct card3 = factory.create("Jimmy");

        card1.use();
        card2.use();
        card3.use();
    }
}

运行结果

这里写图片描述

模式角色

在FactoryMethod模式中涉及的角色如下图:
这里写图片描述

开源框架openTCS开发者指导手册 立即下载

相关推荐

OpenTCS从零学起(一)

OpenTCS 交通控制系统的简单介绍和源码的简单运行。对源码的编译步骤的介绍。本人也是初学希望大家共同努力

Java(基础)工厂方法(FactoryMethod)

概述: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到子类。 适用性: 1.当一个类不知道它所必须创建的对象的类的适合 2.当一个类希望由它的子类来指定它所创建的对象的时候 3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你 希望将哪一个帮助子类是代理者这一信息局部化的时候 package com.day13.abstractTest; import com.sun.xml.internal.ws.api.model.wsdl

asd623444055的博客 1049

openTCS 5.9英文版开发手册

openTCS 5.9英文版开发手册

Java设计模式之—Factory Method模式(工厂模式)

Java设计模式之—Factory Pattern模式(工厂模式) 工厂模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方式;定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 应用场景 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统...

weixin_40649194的博客 329

实测有效防止colab自动断开连接

实测有效防止colab自动断开连接

Thebest_jack的博客 1万+

第三节: 串口通信(用CubeMX学习STM32)

用CubeMX学习STM32, 串口通信学习, 通过轮询方式和中断方式两种方式进行通信演示。 STM32F407zgt6

Kevin_8_Lee的博客 8904

开源AGV调度系统OpenTCS 5.11手把手开发实战(一):保姆级开发环境配置详解

OpenTCS 5.11系统源码与运行环境配置

cxcrycr的专栏 6664

GNSS数据处理新手避坑:手把手教你用GAMP_GOOD下载IGS/MGEX数据(附.cfg文件详解)

本文详细介绍了如何使用GAMP_GOOD进行GNSS数据处理,从基础配置到高级参数调优,帮助新手避开常见错误。内容包括软件安装、配置文件详解、数据源选择、测站文件配置以及性能优化技巧,特别适合GNSS数据处理初学者快速上手。

weixin_30338481的博客 390

【亲测免费】 openTCS 项目教程

openTCS 项目教程 1. 项目的目录结构及介绍 openTCS 项目的目录结构如下: opentcs/ ├── openTCS-API-Base ├── openTCS-API-Injection ├── openTCS-CommAdapter-Loopback ├── openTCS-Common ├── openTCS-Documentation ├── openTCS-Impl-Con...

gitblog_01044的博客 953

Open3D 点云变换【2025最新版】

点云平移、旋转、缩放、欧式变换的python代码实现。博客长期更新,本文最近更新时间为:2025年1月16日。

点云侠的博客 37万+

【花雕学编程】嵌入式破局:MimiClaw入局后,“小龙虾”AI智能体生态的竞争与未来

摘要: 2026年初,开源项目OpenClaw的爆发式增长带动AI智能体赛道迅速崛起,国内外厂商竞相布局,形成多元化的“小龙虾”生态。国外开源社区推出的嵌入式智能体MimiClaw填补了边缘设备场景空白,重塑行业竞争格局。本文系统梳理生态构成,分析云厂商(如腾讯、阿里云)、大模型厂商(如智谱、MiniMax)、硬件/OS厂商(华为)及开源独立派(有道龙虾、MimiClaw)的差异化策略,并预判未来趋势:消费级渗透加速、云边协同、IM整合及模型与Agent深度绑定。同时提醒生态存在数据泄露等高危风险,需警惕安

雕爷学编程 884

Java设计模式之FactoryMethod

一、简介Factory意思为“工厂”,使用上一篇文章介绍的Template Method 模式来构建生成实例的工厂,这就是本文的主角FactroyMethod。在Factory Method模式中,父类决定实例的生成方式,但并不所要生产的具体类,具体的类全部交给子类负责。二、工厂模式的类图逻辑1、所需的类Factory :抽象类,定义生成产品的方法,以及使用Template Method的业务逻辑...

浅谈Android 298

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 730

设计模式(JAVA)——FactoryMethod模式

设计模式(JAVA)之FactoryMethod模式

读书 好学 求知 285

华为OD机试真题 新系统2026-04-15 Python&JS 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 523

在Android中实现SIM卡的读写操作

在上述代码中,我们创建了一个PhoneStateListener的实例,并重写了onSimStateChanged方法来处理SIM卡状态改变的事件。然后,我们通过调用telephonyManager的listen方法注册了这个监听器,并指定了要监听的事件类型为SIM卡状态的改变。在上述代码中,我们调用telephonyManager的sendUssdRequest方法来发送USSD命令,并通过TelephonyManager.UssdResponseCallback来处理USSD响应和发送失败的情况。

2301_79326510的博客 923

java 工厂方法设计模式 FactoryMethod

我们创建一个抽象类来声明工厂方法 ,并可选择包括共享行为,例如定义使用任何对象提供的任何对象发送通知的高级逻辑。但是,随着您的产品不断增长并且您不断添加新的通知类型,有些事情又开始感觉不对劲。因此,您可以添加一个新类,并通过添加一个新块来更新您的 NotificationService 类,以创建 SMS 通知对象,并发送该对象。现在,您的通知代码开始看起来像一个巨大的控制塔。工厂方法设计模式是一种创建设计模式,它提供了一个用于在超类中创建对象的接口,但允许子类更改将要创建的对象的类型。

long316的专栏 541

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 工厂模式(FactoryMethod) - Java实现

设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 工厂模式(FactoryMethod) 是一种代替new的操作的一种模式。可以给系统带来更大的可扩展性和尽量少的修改量。工厂模式分为三种:普通工厂、多个工厂、静态工厂。

Z 525

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java设计模式读书笔记[1]——FactoryMethod模式

模式概念 这是我在读的《图解设计模式》一书上的一张图,最能体现工厂方法模式的效果与内涵。 在Factory Method模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体的处理全部交给子类负责。这样就可以生成实例的框架和实际负责生成实例的类结构。 书中案例 书上的是一个生产id卡的例子,主要用于生产每个人的ID卡。一共有5个类: AbstractProduct类和AbstractF...

weixin_43917604的博客 163

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

浅谈JAVA设计模式之——工厂方法(FactoryMethod)

一、概述             定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。       二、适用性  当一个类不知道它所必须创建的对象的类的时候。  当一个类希望由它的子类来指定它所创建的对象的时候。 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

冰河的专栏 2676

在JAVA中应用设计模式FactoryMethod

 FactoryMethod是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到Factory Method 模式了.简单说来,Factory Method可以根据不同的条件产生不同的实例,当然这些不同的实例通常是属于相同的类型,具有共同的父类.Factory Method把创建这...

做真正的自己 269

Java类库看设计模式Command,AbstractFactory,Singleton

http://www.ibm.com/developerworks/cn/java/l-jdkdp/part2/   简介:  在 上一部分的内容中,我们讲到什么是模式,什么是设计模式,以及对一个设计模式Observer的详细阐叙。相信大家对于模式的概念应该是比较的理解了。这 部分及以后的内容,将会步入正题,从Java类库的分析入手,来阐叙设计模式是如何应用到一个完美的设计中的。实际上,...

sqcwfiu 184

java中createfactory_Java设计模式 create FactoryMethod

工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A()工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽...

weixin_36005427的博客 142

Java设计模式 create FactoryMethod

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33716154的博客 125

java设计模式之工厂方法(FactoryMethod)

工厂方法 解决创建对象的时机问题 将所要创建的对象延迟到子类创建 public interface BMW { //产品的信息介绍、发动方式 void showInfo(); } class BWM3 implements BMW{ @Override public void showInfo() { System.out.println("这是宝马3系"); } } class BWM5 implements BMW{ @Override

weixin_43239397的博客 175
上一篇: java设计模式——TemplateMethod模式
下一篇: Kotlin lambda学习
createchance
博客等级 码龄15年 156粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值