JAVA设计模式之工厂方法模式

医院网络设计(完整文档+思科拓扑图) 大家好,我是小华学长,一名计算机领域的博主。经过多年的学习和实践,我积累了丰富的计算机知识和经验,在这里我想与大家分享我的学习心得和技巧,帮助你成为更好的程序员。作为一名计算机博主,我一直专注于编程、算法、软件开发等领域,在这些方面积累了大量的经验。我相信分享是一种双赢的方式,通过分享,我可以帮助他人提升技术水平,同时也能够得到学习交流的机会。在我的文章中,你将会看到我对于各种编程语言、开发工具以及常见问题的解析和分析。我会结合自己的实际项目经验,为你提供实用的解决方案和优化技巧。 阅读详情


一、 工厂方法模式介绍

         工厂方法模式 , 是创建设计模式之一 。  工厂方法模式是一种构建简单的模式 , 其实我们平时开发中用的也是比较广泛 , 先来看一下工厂方法的模式定义 。


二、工厂方法模式的定义

         Define an interface for creating an object,but let subclasses decide which class toinstantiate.Factory Method lets a class defer instantiation to subclasses.

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


三、工厂方法模式的使用场景

           在任何需要生成复杂对象的地方 , 都可以使用工厂方法模式 。

        当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式

        复杂对象适合使用工厂模式 , 用 new 就可以完成创建的对象无需使用工厂模式

        假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。


四、实战

代码 :

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.gongchangfangfamoshi;

/**
 * Created by liangshaoteng on 17-7-21.
 */
public interface Human {
    //每个人种的皮肤都有相应的颜色
    public void getColor();
    //人类会说话
    public void talk();
}

接口Human是对人类的总称,每个人种都至少具有两个方法,黑色人种、黄色人种、白色人种

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.gongchangfangfamoshi;

/**
 * Created by liangshaoteng on 17-7-21.
 */

public class BlackHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("黑色人种的皮肤颜色是黑色的!");
    }

    @Override
    public void talk() {
        System.out.println("黑人会说话,一般人听不懂。");
    }
}

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.gongchangfangfamoshi;

/**
 * Created by liangshaoteng on 17-7-21.
 */

public class YellowHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("黄色人种的皮肤颜色是黄色的!");
    }

    @Override
    public void talk() {
        System.out.println("黄色人种会说话,一般说的都是双字节。");
    }
}

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.gongchangfangfamoshi;

/**
 * Created by liangshaoteng on 17-7-21.
 */

public class WhiteHuman implements Human {
    @Override
    public void getColor() {
        System.out.println("白色人种的皮肤颜色是白色的!");
    }

    @Override
    public void talk() {
        System.out.println("白色人种会说话,一般都是但是单字节。");
    }
}


注意,我们在这里采用了泛型(Generic),通过定义泛型对createHuman的输入参数产
生两层限制:
● 必须是Class类型;
● 必须是Human的实现类。
其中的"T"表示的是,只要实现了Human接口的类都可以作为参数,泛型是JDK 1.5中的
一个非常重要的新特性,它减少了对象间的转换,约束其输入参数类型,对Collection集合下
的实现类都可以定义泛型。

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.gongchangfangfamoshi;

import static android.icu.lang.UCharacter.GraphemeClusterBreak.T;

/**
 * Created by liangshaoteng on 17-7-21.
 */

public abstract class AbstractHumanFactory {
    public abstract <T extends Human> T createHuman(Class<T> c);
}

通过反射的形式来创建实例

package com.example.liangshaoteng.myapplication.shejimoshizicandao.danyizhizhe.gongchangfangfamoshi;

/**
 * Created by liangshaoteng on 17-7-21.
 */

public class HumanFactory extends AbstractHumanFactory {

    private Human human;

    @Override
    public <T extends Human> T createHuman(Class<T> c) {

        try {
            human = (Human) c.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) human;
    }
}


public class NvWa {
public static void main(String[] args) {
//声明阴阳八卦炉
AbstractHumanFactory YinYangLu = new HumanFactory();
System.out.println("--造出的第一批人是白色人种--");
Human whiteHuman = YinYangLu.createHuman(WhiteHuman.class);
whiteHuman.getColor();
whiteHuman.talk();

System.out.println("\n--造出的第二批人是黑色人种--");
Human blackHuman = YinYangLu.createHuman(BlackHuman.class);
blackHuman.getColor();
blackHuman.talk();

System.out.println("\n--造出的第三批人是黄色人种--");
Human yellowHuman = YinYangLu.createHuman(YellowHuman.class);
yellowHuman.getColor();
yellowHuman.talk();
}
}


五、升级为多个工厂类

当我们在做一个比较复杂的项目时,经常会遇到初始化一个对象很耗费精力的情况,所有的产品类都放到一个工厂方法中进行初始化会使代码结构不清晰。例如,一个产品类有5个具体实现,每个实现类的初始化(不仅仅是new,初始化包括new一个对象,并对对象设置一定的初始值)方法都不相同,如果写在一个工厂方法中,势必会导致该方法巨大无比,那该怎么办?
考虑到需要结构清晰,我们就为每个产品定义一个创造者,然后由调用者自己去选择与哪个工厂方法关联
。


多工厂模式的抽象工厂类

public abstract class AbstractHumanFactory {
public abstract Human createHuman();
}
注意 抽象方法中已经不再需要传递相关参数了,因为每一个具体的工厂都已经非常明
确自己的职责:创建自己负责的产品类对象。

黑种人工厂

public class BlackHumanFactory extends AbstractHumanFactory {
public Human createHuman() {
return new BlackHuman();
}
}

黄种人工厂

public class YellowHumanFactory extends AbstractHumanFactory {
public Human createHuman() {
return new YellowHuman();
}
}
白种人工厂
public class whiteHumanFactory extends AbstractHumanFactory {
public Human createHuman() {
return new WhiteHuman();
}
}

public class NvWa {
public static void main(String[] args) {
//女娲第一次造人,火候不足,于是白色人种产生了
System.out.println("--造出的第一批人是白色人种--");
Human whiteHuman = (new WhiteHumanFactory()).createHuman();
whiteHuman.getColor();
whiteHuman.talk();
//女娲第二次造人,火候过足,于是黑色人种产生了
System.out.println("\n--造出的第二批人是黑色人种--");
Human blackHuman = (new BlackHumanFactory()).createHuman();
blackHuman.getColor();
blackHuman.talk();
//第三次造人,火候刚刚好,于是黄色人种产生了
System.out.println("\n--造出的第三批人是黄色人种--");
Human yellowHuman = (new YellowHumanFactory()).createHuman();
yellowHuman.getColor();
yellowHuman.talk();
}
}


总结

       无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

       所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。



深度学习驱动的股票波动率预测:LSTM和Transformer模型的实战解析 股票市场的波动率一直是金融领域关注的焦点之一。波动率预测对于风险管理、期权定价和资产配置至关重要。深度学习模型,如长短时记忆网络(LSTM)和Transformer,已经在时间序列数据分析领域取得了显著的成就。本博客将向您展示如何使用这两种深度学习模型来进行股票波动率预测,提供清晰的思路和相应的Python代码,以帮助您理解和应用这一重要任务。 阅读详情

相关推荐

gnss变形监测基础(四)

监测站的数据采样率指的是监测站在单位时间内收集数据的频率,通常以赫兹(Hz)为单位。在GNSS变形监测中,数据采样率决定了监测系统能够捕捉到的变形动态变化的详细程度和时间分辨率。例如,一个采样率为1Hz的GNSS监测站意味着它每秒钟收集一次位置数据;而一个采样率为10Hz的监测站则每秒钟收集10次位置数据。较高的采样率能够提供更细致的时间序列数据,有助于分析快速变化的动态过程,如地震活动或建筑物的振动响应。然而,较高的采样率也意味着数据量更大,可能需要更多的存储空间和更强大的数据处理能力。

我的博客 1292

最通俗易懂的讲解工厂模式

该模式用来封装和管理类的创建,终极目的是为了解耦,实现创建者和调用者的分离。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。工厂模式可以细分为三种:简单工厂模式工厂方法模式抽象工厂模式.........

weixin_43757333的博客 2万+

别再只插线了!用示波器‘偷看’USB-C PD协议握手全过程(附BMC/4B5B编码解析)

本文详细介绍了如何使用示波器捕获并解码USB-C PD协议的握手过程,包括BMC/4B5B编码的解析技巧。从硬件配置到波形分析,再到协议注入,为工程师提供了一套完整的实战解码手册,帮助深入理解PD协议的工作原理。

weixin_42526417的博客 402

工厂模式详解

简单工厂模式、工厂方法模式、抽象工厂模式详解+代码示例

qq_45867375的博客 2万+

Ubuntu Server 24.04 安装 (超详细)

本文介绍最小化安装 Ubuntu Server的详细过程。

炀炀的专栏 1万+

自制温湿度计——STM32-L432KC驱动lcd1602和dht11温湿度显示

先给大家甩一张图片哈(附上网址)简单说一下这块板子在这个小项目里的小缺点:一、引脚有点少,lcd1602本来有两种传输数据方式,一种是4bit,另一种是8bit,但是这块板子对于这个项目来说引脚有点少,所以建议用4bit模式。然而,在网上是很难找到设置4bit传输模式的lcd1602的,这也是为什么我写这个blog。二、mbed-os有时候会有大大小小的问题,搞人心态是真的。比如库函数离奇失踪,从官网上下载库函数失败,重装也解决不了然后莫名其妙好了。

m0_72994251的博客 3912

java 23种常用设计模式之解析器模式(Interpreter)

解释器的的适用范围比较小,一般主要用在各种OPP开发的解释器中,比如正则表达式的解释器,或者一个数学表达式的解释器。 下面我们就以解释数学表达式为例子,讲讲什么是解释器模式。 源码: package com.freedom.interpreter; public class Context { private int a; private int b; public Co

The code world of freedom 940

一文梳理金融风控建模全流程(Python)

。借助A卡模型,银行或金融机构能够根据申请人的个人信息和历史数据,对其进行风险评估。这种评估能够帮助金融机构判断借款人是否具备偿还贷款的能力和意愿。

weixin_43420291的博客 4776

Java设计模式 三 工厂方法模式 (Factory Method Pattern)

产品接口定义了不同类型产品的公共方法。

空 1054

利用易特天下 ipbox&零层壹号 sdwan 组网盒子实现异地组网

一款支持zerotier的异地组网盒子

v808v808的博客 3348

【AI智能体】Dify集成 Echarts实现数据报表展示实战详解

Dify集成 Echarts 实现智能数据报表集成与展示实战详解

congge 5961

Java 设计模式之工厂方法模式

工厂方法模式,作为应用相当广泛的设计模式,是我们必须要掌握的,本文是在上一讲 “静态工厂方法模式” 的基础上继续讨论起来的,通过代码示例+Java源码介绍的方式,帮助大家理解这种设计模式。

牛角尖 918

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【设计模式】Java设计模式——工厂方法模式(Factory Method Pattern)

1. 介绍 1.1 定义 工厂方法模式(Factory Method Pattern)又称工厂模式、虚拟构造器模式、多台工厂模式,它属于创建型模式 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。 1.2 作用 将产品类的实例化操作延迟到工厂子类中完成,由工厂子类确定该实例化哪一个具体产品类 2. 模式结构 2.1 UML类图 2.2 模式组成 抽象工厂(Factory):具体工厂的父类,描述具体工厂的公共接口 具体工厂(Concrete Factory):被外部调用

Dust_heart的博客 970

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java 设计模式-工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“顶级类”。这样便分担了对象创建的压力;避免工厂类中用逻辑判断来决定创建对象,而且这样使得结构变得相当灵活当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的规则来生成,那么就可以被客户使用,而不必去修改任何已有的代码,可以看出工厂方法模式符合开闭原则。

精神小牛马 1251

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

介绍 工厂方法模式(Factory Method Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。   工厂方法模式分为三种: 1. 普通工厂方法模式 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建...

潘建南的博客 2013

DesignPattern_Java:Factory Method Pattern

工厂方法模式 Factory Method :(虚拟构造函数模式 Virtual Constructor,多态性工厂模式 Ploymorphic Facoty) Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Metho...

diandingyin9417的博客 159

java设计模式之工厂方法模式(Factory Method Pattern)

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。工厂方法模式的主要优点是增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;

白话机器学习 168

Java设计模式——工厂方法模式(Factory Method Pattern)

都是

奔跑8蜗牛 283

JAVA设计模式之 工厂方法模式【Factory Method Pattern】

一、概述 二、适用场景 三、U

小吕丶Code阶区 1855

【设计模式】工厂方法模式 在java中的应用

【设计模式】工厂方法模式 在java中的应用

qq_42320804的博客 1395

java设计模式——工厂方法模式(Factory Method Pattern)

工厂方法模式包括普通工厂模式、多个工厂方法模式、静态工厂方法模式 普通工厂模式 public interface Sender { public void Send(); } public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!"); } } pu

weixin_43920664的博客 164

Java设计模式--工厂方法模式【Factory Method Pattern】

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担,程序大大提高了灵活性——当有新的产品时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,而不必去修改任何已有的代码,程序提高了扩展性,同时也符合”开闭原则“。        沿用简单工厂方法模式中的例子,随着《中餐厅》的火爆之泰国程度,

CoderLover 463

Java设计模式—— 工厂方法模式( Factory Method Pattern )

工厂方法设计模式:又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。 工厂方法设计模式UML类图如下: ...

zsx18273117003的博客 311

Java设计模式之《工厂方法模式》及使用场景

Java设计模式之《工厂方法模式》及使用场景 原创文章,转载请标注出处:Java设计模式之《工厂方法模式》及使用场景 一、概述 工厂,就是生产产品的地方。 在Java设计模式中使用工厂的概念,那就是生成对象的地方了。 本来直接就能创建的对象为何要增加一个工厂类呢? 这就需要了解工厂方法要解决的是什么问题了,如果只有一个类,我们直接new一个对象完事,这是最简单的;但是如果有多个类呢,而...

ilifei的博客 391

Java23种设计模式之工厂方法模式

Java23种设计模式之工厂方法模式 工厂方法模式(Factory Method Pattern) Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to su...

肖睿的博客 249
上一篇: ubuntu - 安装有道词典
下一篇: JAVA设计模式之抽象工厂模式
有志青年L
博客等级 码龄10年 30粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值