工厂方法设计模式

宇树机器狗go2—slam建图(1)点云格式 上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动,本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式,在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道。宇树机器狗go2仿真会作为一个长期项目来进行不定期更新,仿真不只限于在gazebo上实现,后面还会在isaac sim等仿真平台上教大家如何搭建,其目的还是帮助各位都能以较低的成本加入到宇树机器狗go2的学习中。 阅读详情

生活场景

简单使用代码描述一个食品的加工和生产的过程,中间涉及到食品种类,生产工厂,工人等系列角色。

食品种类代码描述

package com.cloud.model;

public interface Food {

   //每种食物都有名称

   public void getName();

   //每种食物都有价格

   public void getPrice();

}

package com.cloud.model;

public class FishFood implements Food{

   @Override

   public void getName() {

      System.out.println("这种食物叫做:清蒸海鱼!");

   }

   @Override

   public void getPrice() {

      System.out.println("500块钱一条!");

   }

}

package com.cloud.model;

 

public class DunckFood implements Food{

   @Override

   public void getName() {

      System.out.println("这种食物名称叫做:北京烤鸭!");

   }

   @Override

   public void getPrice() {

      System.out.println("200块钱一只");

   }

}

工厂描述代码

package com.cloud.model;

public abstract class AbstractFoodFactory {

   public abstract <T extends Food> T createFood(Class<T> c);

}

package com.cloud.model;

public class FoodFactory extends AbstractFoodFactory{

   @SuppressWarnings("unchecked")

   @Override

   public <T extends Food> T createFood(Class<T> c) {

      //定义生产的一种食物

      Food food = null;

      try {

         food = (Food) Class.forName(c.getName()).newInstance();

      } catch (Exception e) {

         System.out.println("食物生产中断,出现了异常");

         e.printStackTrace();

      }

      return (T)food;

   }

}

工人生产代码

package com.cloud.model;

public class Worker {

   public static void main(String[] args) {

      //声明一个食物工厂

      AbstractFoodFactory foodFactory = new FoodFactory();

      //生产食物--烤鸭

      Food duckFood = foodFactory.createFood(DunckFood.class);

      duckFood.getName();

      duckFood.getPrice();

      //生产食物--鲍鱼

      Food fishFood = foodFactory.createFood(FishFood.class);

      fishFood.getName();

      fishFood.getPrice();

   }

}

工厂方法模式

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

图解

经典代码

package com.cloud.model;

/*****************************************

 * 工人生产产品

 */

public class UsualProduct {

   Factory factory = new ConcreateFactory();

   Product product = factory.createProduct(ConcreateProduct.class);

   //处理实现其他的业务逻辑

}

/******************************************

 * 抽象产品类

 */

abstract class Product{

   //产品类的公共方法

   public void method1(){

      System.out.println("产品共有的方法:名称,价格等...");

   }

   //抽象方法

   public abstract void method2();

}

/**

 * 具体的产品类

 */

class ConcreateProduct extends Product{

   @Override

   public void method2() {

      System.out.println("具体产品类的处理逻辑...");

   }

}

/*************************************************

 * 抽象工厂

 */

abstract class Factory{

   public abstract <T extends Product> T createProduct(Class<T> c);

}

/**

 * 具体工厂类

 */

class ConcreateFactory extends Factory{

   @SuppressWarnings("unchecked")

   @Override

   public <T extends Product> T createProduct(Class<T> c) {

      Product product = null;

      try {

         product = (Product) Class.forName(c.getName()).newInstance();

      } catch (Exception e) {

         // 处理可能出现的异常

      }

      return (T) product;

   }

}

实际应用

工厂方法模式优点

1.      代码清楚,封装性比较好,扩展性比较好

2.      带有约束条件创建对象

简单工厂模式

package com.cloud.model2;

public class Demo1 {

   public static void main(String[] args) {

      Product concreateProduct = ConcreateFactory.createProduct(ConcreateProduct.class);

      concreateProduct.method1();

   }

}

/******************************************

 * 抽象产品类

 */

abstract class Product{

   //产品类的公共方法

   public void method1(){

      System.out.println("产品共有的方法:名称,价格等...");

   }

   //抽象方法

   public abstract void method2();

}

/**

 * 具体的产品类

 */

class ConcreateProduct extends Product{

   @Override

   public void method2() {

      System.out.println("具体产品类的处理逻辑...");

   }

}

/**

 * 具体工厂类

 */

class ConcreateFactory{

   /**

    * 这里修改为静态方法

    */

   @SuppressWarnings("unchecked")

   public static <T extends Product> T createProduct(Class<T> c) {

      Product product = null;

      try {

         product = (Product) Class.forName(c.getName()).newInstance();

      } catch (Exception e) {

         // 处理可能出现的异常

      }

      return (T) product;

   }

}

多工厂模式

package com.cloud.model2;

/*****************************************

 * 工人生产产品

 */

public class Demo2 {

   public static void main(String[] args) {

      Product duckProduct = (new DuckFactory()).createProduct();

      duckProduct.method1();

      Product fisProduct = (new FishFactory()).createProduct();

      fisProduct.method1();

   }

}

/******************************************

 * 抽象产品类

 */

abstract class Product{

   //产品类的公共方法

   public void method1(){

      System.out.println("产品共有的方法:名称,价格等...");

   }

   //抽象方法

   public abstract void method2();

}

/**

 * 具体的产品类

 */

class FishProduct extends Product{

   @Override

   public void method2() {

      System.out.println("食品种类:吃人鱼,100一条...");

   }

}

class DuckProduct extends Product{

   @Override

   public void method2() {

      System.out.println("食品种类:北京烤鸭,100一只...");

   }

}

/*************************************************

 * 抽象工厂

 */

abstract class Factory{

   public abstract Product createProduct();

}

/**

 * 具体工厂类:生产鱼类食品

 */

class FishFactory extends Factory{

   @Override

   public Product createProduct() {

      return new FishProduct();

   }

}

class DuckFactory extends Factory{

   @Override

   public Product createProduct() {

      // TODO Auto-generated method stub

      return new DuckProduct();

   }

}

工厂生产单例对象

class Singleton{

   private Singleton(){}

   public void method(){

      System.out.println("处理业务逻辑...");

   }

}

@SuppressWarnings({ "rawtypes", "unchecked" })

class SingletonFactory{

   private static Singleton singleton;

   static {

      try {

         Class c1 = Class.forName(Singleton.class.getName());

         Constructor constructor = c1.getDeclaredConstructor();

         constructor.setAccessible(true);

         singleton = (Singleton) constructor.newInstance();

      } catch (Exception e) {

         // TODO: handle exception

      }

   }

   public static Singleton getSingleton(){

      return singleton;

   }

}

 

BVH2SMPL 实战笔记 阅读详情

相关推荐

C++版Cesium实战:从OpenGL到3DTiles的全流程开发指南

本文提供了一份C++版Cesium全流程开发指南,详细阐述了如何利用OpenGL和Qt从零构建高性能、可离线部署的三维GIS应用。内容涵盖开发环境搭建、OpenGL渲染引擎初始化、Cesium核心坐标系与场景管理移植,并重点解析了3DTiles数据的解析、异步加载与渲染优化等硬核实战技术,旨在帮助开发者实现与现有C++工业软件的深度集成。

weixin_28077113的博客 164

软件设计模式系列之三———工厂方法模式

工厂方法模式是一种常见的设计模式,属于创建型设计模式之一,它在软件工程中用于对象的创建。该模式的主要思想是将对象的创建过程抽象化,将具体对象的实例化延迟到子类中完成,以便在不同情况下可以创建不同类型的对象,而客户端代码不需要知道实际创建的对象类型。

cooldream2009的博客 991

2024年上半年网络工程师下午真题及答案解析

位于MPLS域边缘、连接其他网络的LSR称为( 3 ),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时,MPLS入口设备分析IP报文的内容并为其添加合适的标签,所有MPLS网络中的LSR根据标签转发数据,当该IP报文离开MPLS网络时,标签由出口LER弹出。LSP的出口LER称为( 6 )。某高校网络拓扑如下图所示,两校区核心(CORE-1、CORE-2),出口防火墙(NGFW-1、NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收敛,两校区相距40km。

bsefef的博客 2471

设计模式——工厂方法模式

工厂方法是一种创建设计模式,它在父类中提供了创建对象的接口,但允许子类更改将要创建的对象类型。

y小川的专栏 9202

STM32F4XX软件模拟I2C实现MPU6050姿态数据采集

本文详细介绍了在STM32F4XX平台上通过软件模拟I2C驱动MPU6050传感器实现姿态数据采集的完整方案。内容涵盖软件I2C的GPIO配置、核心通信函数实现、MPU6050寄存器配置详解以及数据读取处理流程,为硬件资源受限的嵌入式应用提供了灵活的解决方案,并分享了调试技巧与常见问题处理方法。

butter的博客 678

基于Matlab的无迹卡尔曼滤波惯性导航与DVL组合导航

航天航空领域中的惯性导航是一种基于惯性测量单元(Inertial Measurement Unit,IMU)的导航方法,可以提供航向、速度和位置等信息。深度/速度测量器(Doppler Velocity Log,DVL)是一种常用的传感器,可用于测量水下航行器的速度。通过将DVL与无迹卡尔曼滤波相结合,可以实现高精度的组合导航。本文介绍了基于Matlab的无迹卡尔曼滤波(UKF)惯性导航与DVL组合导航的方法。以上是一种简化的示例代码,您可以根据实际应用需求进行相应的修改和优化。

DevSavantX的博客 418

工厂方法模式

工厂方法模式:Factory Method 在我们的日常开发中,很多地方都可以用上工厂方法模式(事实是基础开发中,大部分人从来都不会去考虑使用)。 工厂方法模式英文定义: Define an interface for creating an object, but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. 工厂方法模式

threelifeadv的博客 5483

Unreal 从入门到进阶 之 如何实现Pixel Streaming

Unreal Engine 5 (UE5) 的 Pixel Streaming 是一项基于云端的实时流媒体技术,允许将 UE5 应用的高质量图形渲染结果通过 WebRTC 协议传输到用户的浏览器或轻量级设备,同时将用户输入(如鼠标、键盘、触控)回传到服务器处理。UE的插件相对比较好用,但是就是环境下载总是失败。希望这篇文章对你有所帮助。

TxNet 1369

【设计模式】(二)工厂方法模式详解

针对工厂方法模式进行详细讲解

qq_41526047的博客 2808

基于大语言模型的学术论文阅读辅助分析系统的研究与应用

本文提出了一种基于大语言模型的学术论文阅读辅助分析系统PaperMind,旨在解决传统学术阅读方式面临的三大困境:信息定位困难、跨学科知识断层和手动整理耗时。系统采用检索增强生成(RAG)架构,通过PDF文档解析、语义分割、向量嵌入与FAISS向量检索相结合的技术路线,构建了完整的文档处理流水线。实验结果表明,系统在文档加载分割、向量检索与问答生成环节均达到预期性能指标,检索命中率最高达98%。该系统为学术文献智能化处理提供了可复用的技术方案,有效解决了通用大语言模型在学术场景中的幻觉引用、归因能力不足等问

huanghm88的专栏 93

Aip1640、TM1640驱动程序

本文介绍了AIP1640/TM1640驱动芯片的编程实现,主要包括硬件接口定义和通信协议函数。通过宏定义配置时钟(CLK)和数据线(DIO)的GPIO控制,实现了I2C协议的启动、停止、字节发送等基本操作。核心函数AIP1640_Disp_Drive()完成显示驱动流程:先发送0x40命令设置地址自增模式,再发送0xC0起始地址和16字节显示数据,最后设置亮度参数。文中还包含5微秒延时函数、显示数据缓冲区定义,以及LED和数码管(SMG)的位映射注释说明。该代码适用于控制LED数码管显示,支持亮度调节功能。

zqx的博客 1400

【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

一、工厂方法模式简介、 二、工厂方法模式适用场景、 三、工厂方法模式优缺点、 四、工厂方法模式代码示例、 1、产品抽象类、 2、产品实现类 1、 3、产品实现类 2、 4、抽象工厂类、 5、实现工厂类 1、 6、实现工厂类 2、 7、测试类、 五、扩展上述工厂方法模式、 1、扩展的产品实现类、 2、扩展的工厂实现类、 3、测试类、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6765

Win7/10/11文件拖拽导致资源管理器闪退问题

最近老是遇到把文件从资源管理器拖动到微信或者浏览器时,资源管理器直接闪退的问题,一开始在公司遇到了还以为是电脑配置太低,直到被封闭在家办公,发现自己的高级电脑也有这个问题,那就来了解了解问题是出在什么地方把。

Nicer_feng's blog 1万+

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。 简单工厂简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。  工厂

superbeck的专栏 8万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

C++设计模式 - 简单工厂,工厂方法和抽象工厂

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ...

大秦坑王的专栏 2553

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java工厂方法设计模式及实现(枚举实现工厂方法设计模式)

简介 工厂方法设计模式是一种创建对象的模式,这种模式将创建对象的责任转移到工厂中。 工厂方法包含3部分内容:抽象接口、子类实现、工厂类。一般情况下工厂方法是通过传参来判断创建哪个子类的对象。当然,也可以通过枚举的方式实现工厂方法设计模式。 传统工厂方法设计模式 如下代码,通过CarFactory#createCar接收Class参数,创建子类实例 public interface Car { } ...

p7+的博客 1842

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

23种设计模式-工厂方法(Factory Method)设计模式

23种设计模式-工厂方法设计模式

Hanson的博客 2035

设计模式——简单工厂、工厂方法和抽象工厂的区别与联系

创建型模式中,常用的有工厂方法模式和抽象工厂模式,平时实践还包括简单工厂模式,虽然简单工厂模式不在23种设计模式中。 为了区分以上几种设计模式的差别,通过以下几个例子介绍这几种模式的使用场景以及优缺点。当然,由于本人接触设计模式时间还不长,难免有疏漏之处,欢迎各位提出意见。考虑如今有一个产品,比如椅子,该椅子可以有多种风格,比如中式的,或者美式的。如果我们不想通过设计模式,想要什么类型的椅子,就可以直接实例化某个实体类获得。“ChineseChair.java”——实体类 “Client.java”——用户

weixin_42785235的博客 1942

【深入设计模式】工厂模式—简单工厂和工厂方法

设计模式(Design pattern)是软件工程的基础,最近在对公司项目代码进行迭代升级之后,决定把设计模式相关的知识点拉出来再重新整理一遍进行分享。学习设计模式,不仅是为了面试,更是为了在工作中能够写出易于维护、扩展性好的代码,否则不考虑设计的功能代码也是在给后人挖坑(已经深受其害)。 首先分享的是工厂模式,将这部分分为两部分,第一部分是是简单工厂模式和工厂方法模式的介绍及演进,主要介绍这两种模式结构,以及如何从简单工厂衍生出工厂方法模式。第二部分是抽象工厂模式和工厂模式在源码应用(下一篇博客进行分..

SK_Jaco的博客 1587

简单工厂设计模式和工厂方法设计模式

简单工厂设计模式   不论学习哪一个设计模式,都要知道设计模式可以给我们带来哪些好处,以及我们为什么要学习设计模式。 根据老师教导以及个人的片面经验,我认为使用设计模式的目的是 : 增强代码的复用性以及可维护性。 可维护性就是以后是否方便扩展,增加了新的需求的话,代码是否好改,会不会出现非常难处理的问题,比如说代码没有很好地复用,构建一个对象的过程写到了很多不同的类中,如果要修改构建过程的...

333

彻底搞懂设计模式DesignPattern-工厂模式-简单工厂-工厂方法-静态工厂-抽象工厂

简单工厂 普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 最简单的总结就是一个工厂全负责,里面有判断,用于生产实例 简单工厂模式是属于创建型模式,是工厂模式的一种。 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码) 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式. 首先,创建二者的共同接口: public int

Ping 304

漫谈设计模式之:简单工厂、工厂方法、抽象工厂

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!一个产品不止一个功能,比如我们为高端人群定制了一套出行方案,这个方案里面有配备的车辆,还有人群穿戴的衣服等,这些功能合在一起就成为了“人群”这个产品的功能。弱化一个工厂类通吃的概念,将生产产品的职责交给各自的产品工厂去完成,也就是每一个产品都有一个工厂类,负责完成本身产品的生产。显而易见,只要新增一个产品,就会对工厂类进行修改;

2401_84132496的博客 1040

设计模式(简单工厂、工厂方法、抽象工厂模式)

设计模式(简单工厂、工厂方法、抽象工厂模式) 一、实验目的 1.熟悉建模工具。 2.掌握简单工厂模式、工厂方法模式、抽象工厂模式,并进行设计应用。 二、实验内容 1.简单工厂模式 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot...

Elf.筱焱的博客 960

设计模式之工厂模式(简单工厂,工厂方法,抽象工厂)

简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 简单工厂其实不是一个标准的的设计模式。 23种设计模式中只有「工厂方法模式」与「抽象工厂模式」 1. 简单工厂模式 //接口类 public interface Food { void food(); } // 实现类1 public class RiceBook implements Food{ @Override public vo.

Pole丶逐 284
上一篇: Java中字符流
下一篇: Java中JDBC的PreparedStatement用法
午-夜
博客等级 码龄12年 95粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值