设计模式之工厂模式

【设计模式】工厂模式 上面两种模式不管工厂怎么拆分抽象,都只是针对一类产品(AbstractProduct),如果要生成另一种产品PC,应该怎么表示呢?最简单的方式是把2中介绍的工厂方法模式完全复制一份,不过这次生产的是PC。但同时也就意味着我们要完全复制和修改图片生产管理的所有代码,显然这是一个笨办法,并不利于扩展和维护。抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。 阅读详情

工厂模式

工厂模式分为简单工厂、工厂方法、抽象工厂,属于创建型设计模式。工厂模式的特点是将创建产品对象的过程通过工厂包装起来,客户端只需要调用,不需要关系产品创建的细节。

  • 简单工厂模式:指由一个工厂对象决定创建哪一种产品的对象,不属于GOF23种设计模式。适用于创建对象较少的场景,且客户端需要传入工厂的参数。
  • 工厂方法模式:定义一个创建对象的接口,让实现这个接口的类,来决定实例那个产品对象。工厂方法让类的实例化推迟到子类中进行,工厂方法模式中只需要关心使用哪个产品的工厂,不需要关心产品对象的创建细节,且加入新的产品符合开闭原则。
  • 抽象工厂:提供一个创建一系列相关产品对象的接口,无需指定具体的实现类。客户端不依赖于产品如何创建的细节,强调的是一系列相关产品的对象(同一产品族)的创建需要大量重复代码。

简单工厂模式

适用于产品对象较少,且创建对象的逻辑不复杂。
产品接口

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: ICourse
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:39
 */
public interface ICourse {
    void record();
}

产品实现

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: JavaCourse
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:40
 */
public class JavaCourse implements ICourse{

    @Override
    public void record() {
        System.out.println("java course record");
    }
}

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: PythonCourse
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:41
 */
public class PythonCourse implements ICourse{
    @Override
    public void record() {
        System.out.println("pyhtonCourse record");
    }
}

工厂

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: CourseFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:41
 */
public class CourseFactory {
    public static ICourse creatCourse(Class<? extends ICourse> clas){
        if (clas!=null){
            try {
                return clas.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

客户端使用

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Test1
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:44
 */
public class Test1 {
    public static void main(String[] args) {
        ICourse iCourse=CourseFactory.creatCourse(JavaCourse.class);
        iCourse.record();
        ICourse iCourse2=CourseFactory.creatCourse(PythonCourse.class);
        iCourse2.record();

    }
}

工厂方法模式

如果所需要创建的对象太多,且有自己的逻辑,按照职责单一原则,避免工厂类过于臃肿,将逻辑拆分出来,每个产品类的对象由对应的工厂来实现。

适用场景:

  • 创建对象需要大量的重复代码。
  • 客户端不依赖于产品实例如何被创建,不依赖于实现细节。

缺点:

  • 工厂类的个数过多,增加编码的复杂性。
  • 增加系统的复杂度,代表不易读。

产品接口及产品实现和简单工厂一样,不再说明。

增加工厂接口

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: ICourseFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:55
 */
public interface ICourseFactory {
    ICourse createCourse();
}

产品的工厂实现类

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: CourseFactory2
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:56
 */
public class JavaCourseFactory implements ICourseFactory{
    @Override
    public ICourse createCourse() {
        return new JavaCourse();
    }
}

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: PythonCourseFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:57
 */
public class PythonCourseFactory implements ICourseFactory {
    @Override
    public ICourse createCourse() {
        return new PythonCourse();
    }
}

客户端使用

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Test1
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:44
 */
public class Test1 {
    public static void main(String[] args) {
//        ICourse iCourse=CourseFactory.creatCourse(JavaCourse.class);
//        iCourse.record();
//        ICourse iCourse2=CourseFactory.creatCourse(PythonCourse.class);
//        iCourse2.record();
        ICourseFactory factory1=new JavaCourseFactory();
        factory1.createCourse().record();
        ICourseFactory factory2=new PythonCourseFactory();
        factory2.createCourse().record();

    }
}

抽象工厂

在这里插入图片描述
例如正方形是洗衣机,圆形是电冰箱,菱形是热水器,同一个产品族用一个工厂,即美的的工厂生产美的的洗衣机、电冰箱、热水器。

定义洗衣机、电冰箱、热水器的产品接口

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Washmachine
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:29
 */
public interface Washmachine {
    void work();
}


package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Refrigerator
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:30
 */
public interface Refrigerator {
    void work();
}

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Water
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:30
 */
public interface Water {
    void work();

}


美的的产品实现

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: MediaWashmachine
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:36
 */
public class MediaWashmachine implements Washmachine{
    @Override
    public void work() {
        System.out.println("美的洗衣机work");
    }
}

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: MediaRefrigerator
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:34
 */
public class MediaRefrigerator implements Refrigerator {
    @Override
    public void work() {
        System.out.println("美的电冰箱work");
    }
}
package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: MediaWater
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:32
 */
public class MediaWater implements Water {
    @Override
    public void work() {
        System.out.println("美的热水器work");
    }
}

海尔的产品实现

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: HaierWashMachine
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:37
 */
public class HaierWashMachine implements Washmachine{
    @Override
    public void work() {
        System.out.println("海尔洗衣机work");
    }
}
package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: HaierRefrigerator
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:35
 */
public class HaierRefrigerator implements Refrigerator {
    @Override
    public void work() {
        System.out.println("海尔电冰箱work");
    }
}
package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: HaierWater
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:33
 */
public class HaierWater implements Water {
    @Override
    public void work() {
        System.out.println("海尔热水器work");
    }
}


电器工厂抽象类

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: ElectricalFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:38
 */
public abstract class ElectricalFactory {
    abstract Washmachine createWashMachine();
    abstract Refrigerator crateRefrigerator();
    abstract Water createWater();
}

美的工厂

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: MediaFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:41
 */
public class MediaFactory extends ElectricalFactory {
    @Override
    Washmachine createWashMachine() {
        return new MediaWashmachine();
    }

    @Override
    Refrigerator crateRefrigerator() {
        return new MediaRefrigerator();
    }

    @Override
    Water createWater() {
        return new MediaWater();
    }
}

海尔工厂

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: HaierFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:42
 */
public class HaierFactory extends ElectricalFactory{
    @Override
    Washmachine createWashMachine() {
        return new HaierWashMachine();
    }

    @Override
    Refrigerator crateRefrigerator() {
        return new HaierRefrigerator();
    }

    @Override
    Water createWater() {
        return new HaierWater();
    }
}

客户端使用

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Test1
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:44
 */
public class Test1 {
    public static void main(String[] args) {
//        ICourse iCourse=CourseFactory.creatCourse(JavaCourse.class);
//        iCourse.record();
//        ICourse iCourse2=CourseFactory.creatCourse(PythonCourse.class);
//        iCourse2.record();
//        ICourseFactory factory1=new JavaCourseFactory();
//        factory1.createCourse().record();
//        ICourseFactory factory2=new PythonCourseFactory();
//        factory2.createCourse().record();
        ElectricalFactory electricalFactory =new MediaFactory();
        electricalFactory.crateRefrigerator().work();
        electricalFactory.createWashMachine().work();
        electricalFactory.createWater().work();

        ElectricalFactory electricalFactory1=new HaierFactory();
        electricalFactory1.crateRefrigerator().work();
        electricalFactory1.createWashMachine().work();
        electricalFactory1.createWater().work();

    }
}

Easymesh之拓扑模块(二) 介绍 easymesh 拓扑消息:Topo discovery、Topo notification、Topo query、Topo response 阅读详情

相关推荐

【OTDR曲线工具箱】04 批量生成sor文件

软件下载地址:http://120.78.150.214:9999/isora.zip 通过一个测试数据sor文件,批量生成多个测试文件(基于Bellcore GR196及SR-4731标准)。主要考虑哪些问题: 1、sor测试是否符合要求(主要是衰减系数) 2、多个文件的创建时间 3、文件必须随机处理,不要看省去一模一样。 来说说怎么操作的 第一步:选择参考曲线 参考曲线的选择由两种方法:从文件中导入、从曲线库中选择。 其中曲线库分为公共库和个人库两种,平时浏览的sor文件都可以加载到库中。 第二步

夜晚是传说的博客 5266

Java设计模式——工厂模式

本文对设计模式中工厂模式进行思想和原理的讲解,引用实际例子来方便理解。

weixin_56032340的博客 8632

实战Nocobase插件开发:如何用yarn pm命令快速创建和测试API接口插件

本文详细介绍了如何使用Nocobase插件开发工具快速创建和测试API接口插件,涵盖从环境配置、插件骨架生成到数据模型定义和接口实现的完整流程。通过yarn pm命令简化开发步骤,帮助开发者高效构建支持CRUD的API插件,适用于低代码平台开发场景。

weixin_29313239的博客 456

设计模式之【工厂模式】详解

工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。

Shine19的博客 1143

Moveit Servo学习

MoveIt Servo功能与配置指南 摘要:本文介绍了MoveIt Servo的功能特性,包括支持关节速度、末端执行器速度和位置控制,以及安全功能如奇点检查、碰撞检测等。通过示例展示了如何运行伺服控制demo,详细解析了关键节点和话题。最后以睿尔曼rml_63机器人为例,讲解了如何自定义伺服配置文件,包括环境设置、输入输出参数配置、平滑滤波器和规划场景监控等关键配置项。文章提供了从基础使用到自定义机器人配置的完整指导,帮助开发者实现高效的实时运动控制。

Fisher的博客 1173

3D Slicer-最强大的开源医学图像分割工具简要概述

3D Slicer 是一个免费的开源软件平台,用于医学、生物医学和其他 3D 图像的可视化、处理、分割、配准和分析。读/写DICOM图像和多种其他格式;三维图像、多边形网格和体积渲染的交互式可视化;手动编辑和标记图像;使用刚性和非刚性算法融合和共同配准数据;图像自动分割;跟踪图像引导程序的设备。所有的功能模块可在工具栏里找到,提供搜索,下拉选择,左右切换等功能。3D slicer的大概情况就介绍到这里。它的功能非常强大,也没有必要说掌握每个功能的使用。

Tina姐的博客 2万+

设计模式——工厂模式

工厂模式 在《Head First 设计模式》一书中,一共介绍了一种类似于工厂模式的编程习惯、两种工厂模式,在这篇文章中,我将对它们分别进行介绍,下面首先来看一下简单工厂。 1、简单工厂 按照惯例,我们应该先介绍一下简单工厂的定义,然后举例说明,这一次,我们不这样做,我们首先举例说明,然后再引出简单工厂的定义,后续两个工厂模式均按此方式进行叙述,从案例中理解模式的定义才能够更加印象深刻。...

记录只为更好地前行 4883

Windows Server 2022域控环境下的MDT部署工具安装与配置避坑指南

本文详细介绍了在Windows Server 2022域控环境中安装和配置MDT(Microsoft Deployment Toolkit)的全流程,包括ADK与Windows PE的精准安装、MDT高级配置、部署工作流构建及性能优化技巧。通过实战指南帮助IT管理员实现自动化系统部署,提升企业IT运维效率,特别适用于需要静默下发系统的大规模部署场景。

weixin_28481133的博客 435

工厂设计模式

简单工厂模式(静态工厂模式)虽然不符合设计原则,但是使用方便,实际使用最多工厂方法模式不修改已有类的前提下,通过增加新的工厂类实现扩展抽象工厂模式不可以增加产品,但可以增加产品族应用场景JDK中Calendar的getInstance方法JDBC中的Connection对象的获取Spring中IOC容器创建管理的bean方法反射中Class对象的newInstance方法。

学习总结 1484

如何打开本地网络的防火墙端口(Windows版)解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。问题

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 最开始在遇到这个报错的时候十分不解,后来经过思考,有可能是服务器端口占用,或者并没有放行。因此搜查问题的关键是要先去排查问题。 在搜索栏输入控制面板 选择防火墙 选择开关 保证这些选项是开着的 选择高级设置 新建规则 创建协议端口 选择端口 允许连接 点击下一步 创建规则后点击下一步(后命名) 选择任意端口ALL即可 问题排查完毕!socket创建网络通信时,有读者

weixin_46900108的博客 9万+

Android性能优化之Android Profiler

在移动应用开发中,打造一个流畅、省电且不卡顿的用户体验是至关重要的。然而,随着应用功能的日益复杂,内存泄漏、CPU暴涨、网络卡顿以及电量消耗过快等问题常常化身为隐形杀手,悄悄吞噬着用户体验。为了帮助开发者精准定位并解决这些性能瓶颈,谷歌在Android Studio中集成了一款强大的一站式性能分析工具Android Profiler。Android Profiler作为Android Studio内置的实时数据可视化工具,支持运行在Android 5.0及更高版本的设备上。

xiangzhihong8的专栏 200

【设计模式】之工厂模式(三种)

今天给大家介绍23种设计模式中的工厂模式,学过Spring的小伙伴应该不陌生,今天给大家详细介绍一下它。🌈

小杰不秃头的博客 2323

word多级列表为什么会变成黑块解决思路

今天在写文档时,发现WORD5级的标题都变黑块了,找了度娘的资料,终于解决了。 第一种 1、光标bai放在黑快的右边,按向左的箭头,然后ctrl+shift+s,点击重新应用。 2、点击“定义新的多级列表”(不知道从哪儿找这个按钮的百度下),直接点确定。 3、这里很重要!!!不要直接保存,而是直接关掉word,会提示保存还是不保存,这个地方再点击保存。 第二种 Word2016 使用宏代码修复方法 1.找到视图-宏,打开 查看宏 2.创建宏 3.贴...

霍力强的专栏 8580

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

1.简单工厂设计模式 代码 Video package Factory.简单工厂; public abstract class Video { public abstract void product(); } JavaVideo package Factory.简单工厂; public class JavaVideo extends Video { public voi...

codeDonald的博客 222

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

《C#设计模式》 工厂三兄弟之 【简单工厂模式】,【工厂方法模式】,【抽象工厂模式】

《C#设计模式》 三种工厂设计模式 【简单工厂模式】 【工厂方法模式】 【抽象工厂模式】 第一种:简单工厂模式 一:【简单工厂模式】 简单工厂模式概念(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简...

TimTiny的博客 2590

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【iOS】——工厂设计模式

这种模式旨在为创建对象提供一个统一的接口,隐藏了创建对象的具体逻辑,使得客户端不需要知道所创建对象的具体类,从而降低了对象之间的耦合度,提高了代码的灵活性和可维护性。它为创建对象提供了一种灵活的方式,让子类来决定实例化哪一个类,从而实现了对象创建的延迟化和抽象化,增强了代码的扩展性和可维护性。车没了,该车的引擎和轮胎自然也没了。当系统中加入新产品时,不需要修改抽象工厂和抽象产品提供的接口,也无须修改客户端和其他的具体工厂和具体产品,而只要添加一个具体工厂和与其对应的具体产品就可以了,符合了“开-闭”原则。

m0_73974920的博客 1675

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

设计模式之工厂模式与抽象工厂模式

工厂模式和抽象工厂模式 在设计模式里面,我们发现了其实工厂模式贺抽象工厂模式是单独分开的两个设计模式,接下来我们去探索一下他们呢得不同之处叭! 工厂模式的分类: 简单工厂模式 用来生产同一等级结构中得任意产品(对于增加新得产品,需要修改已有代码) 工厂方法模式 用来生产同一等级结构中得固定产品(支持增减任意产品) 抽象工厂模式 围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂得工厂 核心本质 实例化对象不使用new,用工厂方法代替 将选择实现类,创建对象同意管理和控制

qq_43325476的博客 2399

设计模式-工厂模式

工厂模式是一种创建型设计模式,用于在不直接指定对象的具体类的情况下,创建对象的实例。工厂模式将对象的实例化过程推迟到子类或工厂类,在运行时动态决定创建哪种对象的实例,以提供更灵活的对象创建机制。

qq_40978488的博客 1956

【深入理解设计模式】 工厂设计模式

工厂设计模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中,我们定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

guojiaqi_的博客 1559
上一篇: Windows 下Nacos安装启动
下一篇: 设计模式之模板方法模式
ludkjava
博客等级 码龄11年 173粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值