Java设计模式圣经连载(02)-工厂方法(Factory Method)模式

【实战指南】EC-Engineer中ESI配置与PDO Mapping全流程解析 本文详细解析了EC-Engineer中ESI配置与PDO Mapping的全流程操作,包括环境准备、ESI文件导入技巧、在线配置细节及故障处理。特别强调了WinPcap驱动的兼容性问题和PDO Mapping的最佳实践,帮助工程师高效完成EtherCAT总线配置,适用于工业自动化领域的伺服控制与运动协同场景。 阅读详情
 
Java设计模式圣经连载(02)-工厂方法(Factory Method)模式
1.2 工厂方法(Factory Method)模式
 
    工厂方法模式是类的创建模式,又叫虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
    工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。
 
1.2.1 工厂方法模式的引进
   
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。下面是工厂方法模式的缩略类图:
点击在新窗口查看全图

 
    在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。这个核心工厂则变为抽象工厂角色,仅负责给出具工厂子类必须实现的接口,而不接触哪一产品创建的细节。
    这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。
 
1.2.2 工厂方法模式的结构
   
在工厂方法模式中,一般都有一个平行的等级结构,也就是说工厂和产品是对应的的。抽象工厂对应抽象产品,具体工厂对应具体产品。简单的示意图如下:
点击在新窗口查看全图
 
   
从上图可以看出,工厂方法模式的系统涉及到了以下角色:
    抽象工厂角色:与应用程序无关,任何在模式中创建对象的工厂必须实现这个接口。
    具体工厂角色:实现了抽象工厂接口的具体Java类,含有与引用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
    抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
    具体产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每个具体产品对象都是某个具体产品角色的实例。
 
1.2.3 工厂方法模式在农场系统中的实现
 
1.2.3.1 背景
    在简单工厂模式中,有个全能的园丁,控制所有作物的种植、生长和收获。现在农场规模变大了,管理更加专业化了。过去全能的园丁没有了,每一种作物都有专门的园丁管理,形成了规模化和专业化生产。
 
1.2.3.2 系统设计机构图
点击在新窗口查看全图
 
1.2.3.3 实现源码
 
1.2.3.3.1 水果产品接口Fruit.java
package com.lavasoft.patterns.factorymethod.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:Fruit.java
 * User:    LavaSoft
 * Date:    2006-12-3
 * Time:    17:25:48
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  水果接口
 */
public interface Fruit {
    /**
     * 种植
     */
    void plant();
    /**
     * 生长
     */
    void grow();
    /**
     * 收获
     */
    void harvest();
}
 
1.2.3.3.2 具体产品苹果Apple.java
package com.lavasoft.patterns.factorymethod.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:Apple.java
 * User:    LavaSoft
 * Date:    2006-12-1
 * Time:    0:47:25
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  水果工厂的产品:苹果
 */
public class Apple implements Fruit {
    private int treeAge;
    /**
     * 种植
     */
    public void plant() {
        System.out.println("Apple has been planted.");
    }
    /**
     * 生长
     */
    public void grow() {
        System.out.println("Apple is growing...");
    }
    /**
     * 收获
     */
    public void harvest() {
        System.out.println("Apple has been harvested.");
    }
    /**
     * @return 返回树龄
     */
    public int getTreeAge() {
        return treeAge;
    }
    /**
     * 设置树龄
     */
    public void setTreeAge(int treeAge) {
        this.treeAge = treeAge;
    }
}

1.2.3.3.3 具体产品葡萄:Grape.java
package com.lavasoft.patterns.factorymethod.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:Grape.java
 * User:    LavaSoft
 * Date:    2006-12-1
 * Time:    0:36:56
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  水果工厂的产品:葡萄
 */
public class Grape implements Fruit {
    private boolean seedless;   //是否有籽
    /**
     * 种植
     */
    public void plant() {
        System.out.println("Grape has been planted.");
    }
    /**
     * 生长
     */
    public void grow() {
        System.out.println("Grape is growing...");
    }
    /**
     * 收获
     */
    public void harvest() {
        System.out.println("Grape has been harvested.");
    }
    /**
     * @return 是否有籽
     */
    public boolean getSeedless() {
        return seedless;
    }
    /**
     * 有无籽的赋值方法
     */
    public void setSeedless(boolean seedless) {
        this.seedless = seedless;
    }
    /**
     * 辅助方法
     */
    public static void log(String msg) {
        System.out.println(msg);
    }
}

1.2.3.3.4 具体产品草莓:Strawberry.java
package com.lavasoft.patterns.factorymethod.ybms;

/**
 * Created by IntelliJ IDEA.
 * FileName:Strawberry.java
 * User:    LavaSoft
 * Date:    2006-12-1
 * Time:    0:45:09
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  水果工厂的产品:草莓
 */
public class Strawberry implements Fruit {
    /**
     * 生长
     */
    public void grow() {
        System.out.println("Strawberry is growing...");
    }
    /**
     * 收获
     */
    public void harvest() {
        System.out.println("Strawberry has been harvested.");
    }
    /**
     * 种植
     */
    public void plant() {
        System.out.println("Strawberry has been planted.");
    }
    /**
     * 辅助方法
     */
    public static void log(String msg) {
        System.out.println(msg);
    }
}
 
1.2.3.3.5 水果工厂接口:FruitGardener.java
package com.lavasoft.patterns.factorymethod.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:FruitGardener.java
 * User:    LavaSoft
 * Date:    2006-12-3
 * Time:    17:22:52
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  水果工厂接口
 */
public interface FruitGardener {
    /**
     * 工厂方法
     *
     * @return 水果
     */
    public Fruit factory();
}
 
1.2.3.3.6 苹果工厂:AppleGardener.java
package com.lavasoft.patterns.factorymethod.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:AppleGardener.java
 * User:    LavaSoft
 * Date:    2006-12-3
 * Time:    17:45:29
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  苹果工厂方法
 */
public class AppleGardener implements FruitGardener {
    /**
     * 工厂方法
     *
     * @return 苹果
     */
    public Fruit factory() {
        Fruit f = new Apple();
        System.out.println("水果工厂(AppletGardener)成功创建一个水果:苹果!");
        return f;
    }
}
 
1.2.3.3.7 葡萄工厂:GrapeGardener.java
package com.lavasoft.patterns.factorymethod.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:GrapeGardener.java
 * User:    LavaSoft
 * Date:    2006-12-3
 * Time:    17:51:41
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  添加说明
 */
public class GrapeGardener implements FruitGardener {
    /**
     * 工厂方法
     *
     * @return 葡萄
     */
    public Fruit factory() {
        Fruit f = new Grape();
        System.out.println("水果工厂(GrapeGardener)成功创建一个水果:葡萄!");
        return f;
    }
}
 
1.2.3.3.8 草莓工厂:StrawberryGardener.java
package com.lavasoft.patterns.factorymethod.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:StrawberryGardener.java
 * User:    LavaSoft
 * Date:    2006-12-3
 * Time:    17:53:30
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  添加说明
 */
public class StrawberryGardener implements FruitGardener {
    /**
     * 工厂方法
     *
     * @return 草莓
     */
    public Fruit factory() {
        Fruit f = new Strawberry();
        System.out.println("水果工厂(StrawberryGardener)成功创建一个水果:草莓!");
        return f;
    }
}
 
1.2.3.3.9 测试类(客户端):TestApp.java
package com.lavasoft.patterns.factorymethod.ybms;
/**
 * Created by IntelliJ IDEA.
 * FileName:TestApp.java
 * User:    LavaSoft
 * Date:    2006-12-3
 * Time:    17:54:48
 * 《Java与模式》(--阎宏博士著)读书笔记
 * 工厂模式--工厂方法模式--一般性模式(农场应用)
 * ReadMe:  测试类(客户端)
 */
public class TestApp {
    private FruitGardener f1, f2, f3;
    private Fruit p1, p2, p3;
    private void test() {
        //实力化水果工厂
        f1 = new AppleGardener();
        f2 = new GrapeGardener();
        f3 = new StrawberryGardener();
        //从水果工厂生产水果
        p1 = f1.factory();
        p2 = f2.factory();
        p3 = f3.factory();
    }
    public static void main(String args[]) {
        TestApp test = new TestApp();
        test.test();
    }
}
 
1.2.3.3.10 测试运行结果
    水果工厂(AppletGardener)成功创建一个水果:苹果!
    水果工厂(GrapeGardener)成功创建一个水果:葡萄!
    水果工厂(StrawberryGardener)成功创建一个水果:草莓!
    Process finished with exit code 0
 
1.2.3.4 关于工厂方法模式的实现
   在下面我简单说说一些实现方式,不做详细分析了。
 1.使用java接口或者java抽象类
 2.使用多个工厂方法
 3.产品循环使用
 4.多态性的丧失和模式的退化,主要体现在工厂方法创建对象、工厂方法返回的类型、工厂等级结构三个方面。
 
1.2.3.5 女娲举绳造人
 
   女娲举绳造人是工厂方法模式的一个实例。下面仅仅给出设计图如下,具体编码请您自己实现。
点击在新窗口查看全图
 
 
   呵呵,学会了简单工厂模式再来学工厂方法,是不是很容易啊,看懂农场一个例子就够了,多实践多思考比什么都好!
基于sklearn实现LDA主题模型(附实战案例) 目录LDA主题模型1.LDA主题模型原理2.LDA主题模型推演过程3.sklearn实现LDA主题模型(实战)3.1数据集介绍3.2导入数据3.3分词处理 3.4文本向量化3.5构建LDA模型3.6LDA模型可视化 3.7困惑度 其实说到LDA能想到的有两个含义,一种是线性判别分析(Linear Discriminant Analysis),一种说的是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)。 现在讨论的是主题模型 阅读详情

相关推荐

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型

Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。

jkh920184196的博客 1933

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

意图(工厂模式又称工厂方法模式) 工厂方法模式意图:一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式是以一个类的实例化延迟到其子类。 Factory Method模式用于在不指定待创建对象的具体类的情况下创建对象。 Factory Method模式的主要意图是隐藏对象创建的复杂性。Client通常不指定要创建的具体类,Client将面向接口或抽象类进行编码,让Factory类负责...

易兒善 400

在macOS上使用GitHub的超详细指南

GitHub:免费的远程仓库,可用来托管自己的开源项目。它利用了Git强大的克隆和分支功能,让我们参与别人的开源项目和让别人参与自己的开源项目变得简单高效。

Mars的博客 3393

java定义苹果类Apple_定义一个水果接口Fruit,里面定义一个表示吃水果的eat方法。定义一个苹果类Apple和一个橘子...

importjava.util.Scanner;interfaceFruit{publicvoideat();//创建一个Fruit接口,里面包含一个eat方法}classAppleimplementsFruit{publicvoideat(){System.out.print("不想吃苹果");//创建一个Apple类,包含一个eat()方法}}classOrangeimplementsFrui...

weixin_35264158的博客 3675

基于STM32的智能火灾报警系统设计:多传感器融合与远程控制实现

本文详细介绍基于STM32单片机的智能火灾报警系统设计,采用多传感器融合技术(烟雾、温度、火焰检测)实现高精度火灾识别。系统集成远程控制与手机APP监控,通过加权决策算法降低误报率,提供多级响应策略,确保火灾预警的准确性与可靠性。

u5v6w7的博客 1104

字符串相似度比较算法:Jaro–Winkler similarity的原理及实现

前言 在前面的文章中,笔者有对编辑距离以及Levenshtein距离进行详细的说明,其实levenshtein距离是编辑距离的其中一种定义,本文所说的Jaro距离是编辑距离的另外一种定义,它也是对两个字符串的相似度进行衡量,以得出两字符串的相似程度。下面我们一起来学习这个算法的原理以及实现吧。 标题算法定义 下面先说说Jaro distance(又称Jaro similarity),这是由Matt...

蓝天白云梦的csdn博客 1万+

设计模式之工厂方法模式

工厂方法模式是一种非常实用的设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类。这种方式将对象的创建逻辑封装在工厂类中,使得客户端代码与具体的产品类解耦,提高了系统的灵活性和可扩展性。同时,工厂方法模式也具有一定的局限性,如类的个数容易过多、系统扩展繁琐等。因此,在设计系统时,需要根据实际情况选择合适的设计模式。

一个老Java开发的自白 1407

LSTM模型 轨迹经纬度预测

原始时间序列数据如下所示,我们只取前两列纬度和经度作为输入数据 我们设定用前六个位置信息预测下一个位置,则两个样本的输入输出数据如下所示: 创建LSTM网络训练模型: import numpy as np from keras.layers.core import Dense, Activation, Dropout from keras.layers import LS...

Muzi_Water的博客 2万+

java8 @FunctionInterface 实现模板方法设计模式 业务重试封装

java8 @FunctionInterface 实现模板方法设计模式,公共方法的封装:比如业务重试 使用spring-retry @Retryable 注解 /** * 通用回调函数接口 * * @author zhaoyang10 * @date 2020/07/23 */ @FunctionalInterface public interface CallBack<T> { /** * 执行回调操作的方法 */ T call(); } /

zhaoyang10的专栏 1261

构建面向嵌入式Linux的ARM64交叉编译工具链:从sysroot配置到CMake实战

本文详细介绍了如何构建面向嵌入式Linux的ARM64交叉编译工具链,从sysroot配置到CMake实战。通过分步指导,帮助开发者解决架构不一致问题,提升编译效率,特别适用于树莓派等ARM64设备开发。文章涵盖sysroot机制、环境搭建、CMake配置及常见问题解决方案,是嵌入式开发的实用指南。

weixin_42537142的博客 200

开源GIS -- 笔记

基础开发库 数据读写:GDAL/OGR(C/C++) ArcGIS和GE都是使用此工具 投影转换:Proj.4(C/C++) 拓扑计算:JTS(Java),GEOS(C++),Shapely(python) 组件式开发库 GeoTools(Java),DotSpatial(.NET) 空间分析: Scipy(通用科学计算、方程求解), numpy,NextworkX, rPy(统计分析), Scikit-learn,pysal(空间分析) 深度学习: Keras、 tensorflow、 pytor

DZ Space 4521

Java 编程问题:八、函数式编程-基础和设计模式

Java 编程问题:八、函数式编程-基础和设计模式

龙哥盟 1378

JumpServer未授权访问漏洞 CVE-2023-42442

JumpServer 是全球首款完全开源的堡垒机, 使用GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统。 JumpServer 使用Python / Django 进行开发。2021年1月15日,阿里云应急响应中心监控到开源堡垒机JumpServer发布更新,修复了一处远程命令执行漏洞。由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求获取到日志文件获取敏感信息,或者执行相关API操作控制其中所有机器。

holyxp的博客 1426

Java8函数式编程实现一个工厂

函数式编程的好处: 减少可变量的声明,能够更好的利用并行,代码更加简洁可读。 下面来讲讲我怎么通过函数式来实现一个工厂: 首先,创建一个函数接口:

必行 1001

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

设计模式之工厂方法

理念介绍: 工厂方法是一种创建设计模式,即与对象创建相关。在工厂模式中,我们在不向客户端公开创建逻辑的情况下创建对象,客户端使用相同的公共接口来创建新类型的对象。 这个想法是使用一个静态成员函数(静态工厂方法)来创建和返回实例,向用户隐藏类模块的细节。 工厂模式是创建对象的核心设计原则之一,它允许客户端以与库的类层次结构没有紧密耦合的方式创建库的对象。 库是一些第三方提供的东西,它暴露了一些公共 API,客户端调用这些公共 API 来完成他们的任务。 第二种介绍: 工厂方法的意图,定义用于创建对象的接口,但

a15322910600的博客 221

android 蓝牙通讯demo

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

C++设计模式

文章目录简单工厂模式工厂方法模式抽象工厂模式 简单工厂模式 简单工厂模式有一个工厂,可以生产多个产品,包含两个接口,一个是产品类的,一个是工厂类的。 产品类需要有一个基类,基类中的具体产品实现需要是个纯虚函数,这样一来,产品的子类必须要重写具体的产品实现,实现不同的功能。 产品类封装完成后,还需要一个工厂类,工厂类对产品类再次封装,最终实现由一个工厂对象决定创建出哪一种产品类的实例。 //简单工厂模式 #include<iostream> using namespace std; #defin

xnxygxp的博客 1158

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

qq_41526047的博客 2809

【设计模式】第4章·工厂方法模式

在工厂方法模式中不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。

weixin_44143114的博客 1623

工厂模式-工厂方法模式

阐述工厂方法设计模式的详情

foshansuperinter的博客 969

工厂方法模式(Factory Method Pattern)

工厂方法模式概述与demo实现

打盹儿的博客 1366

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

工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。   工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 一。简解工厂方法模式是在简单工厂模式基础上做了一点改进,生产某一类方法的工厂,不仅仅局限于某个(简单工厂模式是生产某个)。二。用途 主要是用来根据需求生产某

小鼠标的博客 2104

工厂方法模式(Factory Method Pattern)理论篇

工厂方法模式属于类的创建型模式,它又被称为多态工厂模式(Factory MethodPattern)。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中 一、什么是工厂方法模式 工厂方法模式属于类的创建型模式,它又被称为多态工厂模式(Factory MethodPa

Robin Hu的专栏 2405

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

工厂模式(Factory Pattern)是Java中最常用的设计模式之一,属于创建型模式。这种模式提供了一种将对象的实例化过程封装在工厂类中的方式,用于封装和管理对象的创建。工厂模式包括三种不同的形式:简单工厂模式、工厂方法模式和抽象工厂模式。这三种模式在形式和特点上是极为相似的,都是为了更好地解耦。简单工厂模式是一种最简单的工厂模式,它提供了一个创建对象的最佳方式;工厂方法模式是一种将对象的实例化过程延迟到子类中进行的模式;抽象工厂模式是一种将创建一套产品族的操作交给一个工厂处理的模式。

miaoyl的博客 834

工厂模式来啦

1 简单工厂模式 SimpleFactory package factory.simplefactory; public class SimpleFactory { public static Cloth getCloth(String type){ if ("jok".equals(type)){ return new Jok(); }else if ("dress".equals(type)){ re..

weixin_47552725的博客 549

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

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

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6767
上一篇: Java设计模式圣经连载(01)-简单工厂模式
下一篇: Java设计模式圣经连载(04)-单例模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值