.NET高级面试指南专题十二【 工厂模式介绍,工厂模式和抽象工厂模式的区别】

news2024/11/16 3:37:06

在这里插入图片描述

工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式,同时隐藏了创建对象的复杂性。工厂模式通过定义一个接口或抽象类来创建对象,但是将具体的对象实例化的过程延迟到子类中。这种模式可以根据需要返回子类的实例,而不是直接实例化对象。

原理:
工厂模式包含一个工厂类,该类负责创建其他类的对象。它具有一个方法,该方法根据给定的条件或参数返回不同类的实例。

常用场景:

  • 当一个类不知道它必须创建的对象的类时。
  • 当一个类希望由它的子类来指定创建对象时。
  • 当类将创建对象的职责委托给多个帮助子类中的其中一个,并且希望动态地决定到底使用哪一个时。

优点:

  • 可以隐藏对象的创建细节,使代码更容易维护。
  • 通过引入抽象层,降低了代码的耦合度。
  • 可以更轻松地扩展工厂类以支持新的产品。

缺点:

  • 引入了额外的类,增加了代码的复杂度。
  • 当产品类非常多时,可能会导致工厂类变得庞大且难以维护。

代码示例:

using System;

// 定义抽象产品类
abstract class Vehicle
{
    public abstract void Drive();
}

// 具体产品类
class Car : Vehicle
{
    public override void Drive()
    {
        Console.WriteLine("Driving a car...");
    }
}

// 具体产品类
class Truck : Vehicle
{
    public override void Drive()
    {
        Console.WriteLine("Driving a truck...");
    }
}

// 定义工厂类
class VehicleFactory
{
    public Vehicle GetVehicle(string vehicleType)
    {
        switch (vehicleType.ToLower())
        {
            case "car":
                return new Car();
            case "truck":
                return new Truck();
            default:
                throw new ArgumentException("Invalid vehicle type.");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 使用工厂类创建不同类型的车辆
        VehicleFactory factory = new VehicleFactory();

        Vehicle car = factory.GetVehicle("car");
        car.Drive();

        Vehicle truck = factory.GetVehicle("truck");
        truck.Drive();
    }
}

抽象工厂模式:

抽象工厂模式通过引入一个抽象工厂接口和多个具体工厂类来实现,每个具体工厂类负责创建一组相关的产品,这些产品通常在逻辑上属于同一个产品族或者具有相关特性。

在抽象工厂模式中,客户端通过与具体工厂的接口交互来创建产品,而不是直接实例化具体产品。这样客户端代码与具体产品的实现解耦,使得系统更易于扩展和维护。

代码示例

using System;

// 抽象产品类
abstract class Vehicle
{
    public abstract void Drive();
}

// 具体产品类
class Car : Vehicle
{
    public override void Drive()
    {
        Console.WriteLine("Driving a car...");
    }
}

// 具体产品类
class Truck : Vehicle
{
    public override void Drive()
    {
        Console.WriteLine("Driving a truck...");
    }
}

// 抽象工厂接口
interface IVehicleFactory
{
    Vehicle CreateVehicle();
}

// 具体工厂类 - 生产轿车
class CarFactory : IVehicleFactory
{
    public Vehicle CreateVehicle()
    {
        return new Car();
    }
}

// 具体工厂类 - 生产卡车
class TruckFactory : IVehicleFactory
{
    public Vehicle CreateVehicle()
    {
        return new Truck();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 使用抽象工厂创建不同类型的车辆
        IVehicleFactory carFactory = new CarFactory();
        Vehicle car = carFactory.CreateVehicle();
        car.Drive();

        IVehicleFactory truckFactory = new TruckFactory();
        Vehicle truck = truckFactory.CreateVehicle();
        truck.Drive();
    }
}

工厂模式和抽象工厂模式的区别

工厂模式和抽象工厂模式都是用于创建对象的设计模式,但它们在设计上有一些重要区别:

目的:

  • 工厂模式的主要目的是创建单个类的实例,它提供了一个统一的接口来创建对象,但是不同的实现类可能会创建不同类型的对象。
  • 抽象工厂模式的目的是创建一系列相关或相互依赖的对象,而不需要指定具体的类。它提供了一个接口,用于创建一组相关的产品,这些产品通常在逻辑上属于同一个产品族或者具有相关特性。

结构:

  • 工厂模式包含一个抽象工厂和多个具体工厂,每个具体工厂负责创建一种具体类型的对象。
  • 抽象工厂模式包含一个抽象工厂和多个具体工厂,每个具体工厂负责创建一组相关的产品,通常涉及多个抽象产品和多个具体产品。

抽象程度:

  • 工厂模式更加灵活,它只关注于创建单个类的实例,具体的实现可以根据需要进行更改。
  • 抽象工厂模式更加抽象,它将一组相关的产品封装在一个工厂中,客户端无需了解产品的具体实现,只需通过工厂来创建产品即可。

使用场景:

  • 工厂模式适用于需要根据条件动态创建单个对象的场景。
  • 抽象工厂模式适用于需要创建一组相关对象的场景,特别是这些对象需要以一种一致的方式进行管理和使用的情况。

总之,工厂模式更注重单一对象的创建,而抽象工厂模式更注重一组相关对象的创建,它们各自的设计目标和使用场景不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PXE网络启动实战(第一篇 启动WinPE)

免责声明:文中有一些图片来源自网络,如有版权请通知我删除,谢谢! 目录 一、无盘站 二、PXE启动 三、PXE启动原理 四、启动WinPE 1、服务器准备 2、客户端 3、TFTP服务 4、WinPE选择 5、具体操作: 预告 一、无盘站 网络启动最早用于无盘系统,那时的电脑只配备软…

【软件测试】selenium元素定位方式大全!

前言 当我们在使用selenium进行自动化测试工作时,元素定位是非常重要的一环,因为我们是借助脚本模拟我们通过鼠标和键盘对元素进行点击、输入内容和滑动操作的,所以准确的元素定位是我们执行测试脚本的重要一环。本文就来给大家介绍一下sele…

3、皮卡丘代码审计(3)

一、命令/代码执行 基础知识 win系统 |不管A成功还是失败,两者都会执行,但只输出B的结果&不管A成功还是失败,两者都会执行,两者结果都会输出注意的是:&有可能会被当做分割参数的符号,导致没有出…

ceph性能测试

查看集群状态 ceph -s查看osd情况 ceph osd tree创建pg_num为60的pool&#xff0c;名为test。 ceph osd pool create test 60rados bench用于测试rados存储池底层性能&#xff0c;该工具可以测试写、顺序读、随机读三种类型 rados bench -p <pool_name> <seconds&…

springboot基于web的酒店客房管理系统论文

基于web的酒店客房管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了酒店客房管理系统的开发全过程。通过分析酒店客房管理系统管理的不足&#xff0c;创建了一个计算机管理酒店客房管理系统的方案。文…

LZO索引文件失效说明

在hive中创建lzo文件和索引时&#xff0c;进行查询时会出现问题.hive的默认输入格式是开启小文件合并的&#xff0c;会把索引也合并进来。所以要关闭hive小文件合并功能&#xff01;

Java多线程导出Excel示例

在之前的Java多线程导入Excel示例中演示了如何通过多线程的方式导入Excel&#xff0c;下面我们再来看下怎么通过多线程的方式导出Excel 还是直接上代码 首先是Controller import com.sakura.base.service.ExcelService; import org.springframework.beans.factory.annotation.…

Vue中如何实现条件渲染?

在Vue中实现条件渲染非常简单且灵活&#xff0c;主要通过Vue的指令来实现。在Vue中&#xff0c;我们可以使用v-if和v-else指令来根据条件来渲染不同的内容。下面就让我们通过一个简单的示例来演示如何在Vue中实现条件渲染&#xff1a; <!DOCTYPE html> <html lang&qu…

Unity安装与简单设置

安装网址&#xff1a;https://unity.cn 设置语言&#xff1a; 设置安装位置&#xff1a;否则C盘就会爆了 获取一个个人的资格证&#xff1a; 开始安装&#xff1a; 安装完毕。 添加模块&#xff1a;例如简体中文 新建项目&#xff1a; 布局2*3、单栏布局、 设置…

2024有哪些免费的mac苹果电脑深度清理工具?CleanMyMac X

苹果电脑用户们&#xff0c;你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅&#xff1f;可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻&#xff0c;拥有一些高效的深度清理工具就显得尤为重要。今天&#xff0c;我将介绍几款优秀的苹果电脑深度清理工具…

飞书文档批量导出

背景需求 最近所参与的项目即将结项&#xff0c;需要将飞书中的产品需求文档&#xff08;PRD&#xff09;交付给甲方&#xff0c;由于文档较多&#xff0c;大概有两百多个&#xff0c;一个一个的下载导出&#xff0c;太麻烦了&#xff08;PS&#xff1a;本人比较懒&#xff09;…

【MySQL】mvcc以及三个重要日志

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;【】数据库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 MVCC关键概念&#xff1a; MVCC机制的优点&#xff1a; 三个重要的日志&#xff1a; 重做日志&#xff1a; 回滚日志&am…

智能汽车加速车规级存储应用DS2431P+TR 汽车级EEPROM 存储器IC

DS2431PT&R是一款1024位1-Wire EEPROM芯片&#xff0c;由四页存储区组成&#xff0c;每页256位。数据先被写入一个8字节暂存器中&#xff0c;经校验后复制到EEPROM存储器。该器件的特点是&#xff0c;四页存储区相互独立&#xff0c;可以单独进行写保护或进入EPROM仿真模式…

软考重点题解析-基础知识

1.加密技术&#xff1a;分为对称加密技术&#xff1a;文件的加密和解密使用相同的密钥 和 非对称加密技术&#xff1a;加密和解密不同的密钥&#xff0c;分别是公开密钥和私有密钥。 例题&#xff1a;若A,B两人分别在认证机构&#xff08;CA&#xff09;M,N处获得证书&…

修改centos7的dns解决docker拉取镜像超时问题

近期在一台centos7的服务器上部署系统&#xff0c;拉取docker镜像时总是超时&#xff0c;如图所示。网上有教程说&#xff0c;可以修改操纵系统的dns地址&#xff0c;试了一下&#xff0c;果然搞定。 打开dns配置文件 sudo vi /etc/resolv.conf发觉里面的地址设为114.114.114…

自动粘贴与网址管理,让您的网络生活更便捷!“

在数字化世界中&#xff0c;网址和文本信息的复制粘贴已成为我们日常操作中的家常便饭。然而&#xff0c;频繁的手动操作不仅效率低下&#xff0c;还容易出错。想象一下&#xff0c;如果能有一种工具&#xff0c;只需一键之触&#xff0c;就能自动完成粘贴和网址管理&#xff0…

【树莓派系统配置+python3.8+环境配置踩坑点汇总】raspberrypi

最近又开始搞树莓派的深度学习模型。很多windows端的环境需要在树莓派上重新部署&#xff0c;中间出现了非常多的问题。主要以各种库的下载安装为主要。 首先&#xff0c;第一个问题&#xff1a; 树莓派系统烧录之后&#xff0c;默认apt一般需要升级看&#xff0c;而默认下载…

redis05 sprngboot整合redis

redis的Java客户端 整合步骤 添加redis的pom依赖 <!-- 引入redis依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency><!-- 引入redis连…

整数和浮点数在内存中的存储(大小端字节序,浮点数的存取)

目录 1.整数在内存中的存储 2.大小端字节序和字节序判断 2.1什么是大小端&#xff1f; 2.2为什么会有大小端 3.浮点数在内存中的存储 3.1浮点数的存储 3.1.1 浮点数存的过程 3.1.2 浮点数取的过程 3.2 解析 3.3 验证浮点数的存储方式 1.整数在内存中的存储 整数的二进…

Tomcat部署Web服务器及基础功能配置

前言 Tomcat作为一款网站服务器&#xff0c;目前市面上Java程序使用的比较多&#xff0c;作为运维工人&#xff0c;有必要了解一款如何去运行Java环境的网站服务。 目录 一、Java相关介绍 1. Java历史 2. Java跨平台服务 3. Java实现动态网页功能 3.1 servelt 3.2 jsp …