设计模式01:创建型设计模式之单例、简单工厂的使用情景及其基础Demo

一、单例模式

1.情景

连接字符串管理

2.好处

  • 代码简洁:可全局访问连接字符串。
  • 性能优化:一个程序一个连接实例,避免反复创建对象(连接)和销毁对象(连接)。
  • 线程安全:连接对象不会被重复创建,从而避免并发冲突。

3.Demo

using System;
using SqlSugar;public class SqlSugarSingleton
{// 使用 Lazy<T> 来保证延迟初始化和线程安全//Lazy<T> 通过内部的机制确保在多线程环境下的安全性,而且在首次访问时才会初始化对象实例,从而避免了重复创建和资源浪费。private static readonly Lazy<SqlSugarClient> lazyInstance = new Lazy<SqlSugarClient>(() =>{// 配置 SqlSugarClient 实例return new SqlSugarClient(new ConnectionConfig{ConnectionString = "Server=localhost;Database=TestDB;User Id=myuser;Password=mypassword;",DbType = DbType.MySql, // 根据你的数据库类型选择IsAutoCloseConnection = true,InitKeyType = InitKeyType.Attribute});});// 获取 SqlSugarClient 实例public static SqlSugarClient Instance => lazyInstance.Value;
}class Program
{static void Main(){// 获取唯一的 SqlSugarClient 实例SqlSugarClient db = SqlSugarSingleton.Instance;// 示例查询var result = db.Queryable<Student>().Where(s => s.Age > 18).ToList();Console.WriteLine($"查询结果数量: {result.Count}");}
}// 假设我们有一个学生类,用于展示查询操作
public class Student
{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }
}

二、简单工厂模式

1.情景 

        可由参数决定实例化哪个类,不同的类调用相同的方法有不同的效果。

2.好处

  • 便于开发:无需知道具体类的实现细节,只需要通过入参实现想要的效果
  • 扩展方便:若要增加或者修改,对抽象类的子类操作即可,不需要改客户端代码(Main函数)
  • 简单简洁:减少了客户端(Main函数)的复杂度,调用时简洁大方。

3.代码思路

  • 抽象类和子类:写一个抽象类(含抽象方法),再写n个它的子类(及其父类抽象方法的实现)
  • 工厂类:写一个简单工厂,由字符串决定要实例化的类
  • 客户端使用:先用简单工厂创建对象,然后再用这个对象调用方法

4.Demo

using System;// 抽象产品类 (先写一个抽象类,含有抽象方法)
public abstract class Product
{public abstract void Show();
}// 具体产品 A (再写n个它的子类,及其父类抽象方法的实现)
public class ConcreteProductA : Product
{public override void Show(){Console.WriteLine("ConcreteProductA");}
}// 具体产品 B
public class ConcreteProductB : Product
{public override void Show(){Console.WriteLine("ConcreteProductB");}
}// 简单工厂 (然后,写一个简单工厂,由字符串决定要实例化的类)
public class ProductFactory
{public static Product CreateProduct(string type){if (type == "A")return new ConcreteProductA();else if (type == "B")return new ConcreteProductB();elsethrow new ArgumentException("Invalid product type");}
}class Program
{static void Main(){//客户端使用:先用简单工厂创建对象,然后再用这个对象调用方法Product productA = ProductFactory.CreateProduct("A");productA.Show();Product productB = ProductFactory.CreateProduct("B");productB.Show();}
}

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

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

相关文章

【不太正常的题】LeetCode.232:用栈的函数接口实现队列

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;初阶数据结构刷题 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f697; 1.问题描述&#xff1a; 题目中说了只能使用两个栈实现队列&#xff0c;并且只能使用…

Linux搭建text-generation-webui框架,安装通义千问大模型,开放对外api,voxta测试对话图文教程

目录 text-generation-webui部分 开放对外API 通义千问部分 远程API对话测试部分 text-generation-webui部分 本来不想发这个文章的&#xff0c;但是自己部署的时候看了挺多人的帖子&#xff0c;很多发的不全面&#xff0c;要么就是跟着他们流程走有些小问题啥的&#xff…

QT程序发布后,mysql在其它电脑设备无法连接数据库

QT程序发布后&#xff0c;mysql在其它电脑设备无法连接数据库 D:\mysql-5.7.24-winx64\lib, mysql-5.7.24-winx64是一个压缩包&#xff0c;用于启动mysql服务&#xff0c;创建数据库 压缩包 解决方法&#xff1a; 拷贝库到exe的相同目录&#xff0c;libmysql.dll,libmysql.li…

ElasticSearch 的核心功能

要深入理解 ElasticSearch 的核心功能&#xff0c;需要全面掌握其 全文搜索、分析、聚合 和 索引生命周期管理&#xff08;ILM&#xff09; 的设计原理和实际应用。 1. 全文搜索 ElasticSearch 的全文搜索是其核心功能之一&#xff0c;依赖于倒排索引和强大的分词、相关性评分…

在Nginx部署Web应用,如何保障后端API的安全

1. 使用HTTPS和http2.0 参考&#xff1a;Nginx配置HTTP2.0_nginx 支持 2.0-CSDN博客 2. 设置严格的CORS策略 通过add_header指令设置CORS头。 只允许来自https://frontend.yourdomain.com的请求访问API location /api/ {if ($http_origin ~* (https://frontend\.yourdomai…

Nginx单向链表 ngx_list_t

目录 基本概述 数据结构 接口描述 具体实现 ngx_list_create ngx_list_init ngx_list_push 使用案例 整理自 nginx 1.9.2 源码 和 《深入理解 Nginx&#xff1a;模块开发与架构解析》 基本概述 Nginx 中的 ngx_list_t 是一个单向链表容器&#xff0c;链表中的每一个节…

es快速扫描

介绍 Elasticsearch简称es&#xff0c;一款开源的分布式全文检索引擎 可组建一套上百台的服务器集群&#xff0c;处理PB级别数据 可满足近实时的存储和检索 倒排索引 跟正排索引相对&#xff0c;正排索引是根据id进行索引&#xff0c;所以查询效率非常高&#xff0c;但是模糊…

软件需求建模方法

软件需求建模是一个涉及多个学科的领域&#xff0c;其研究方向广泛且多样。以下是一些主要的研究方向&#xff1a; 1. 需求工程方法&#xff1a;研究如何更有效地收集、分析、规格化和验证软件需求。这包括新的需求工程方法论和工具的开发。 2. 需求管理&#xff1a;关注需求…

软件项目需求分析的实践探索(1)

一、项目启动与规划 组建团队 包括项目经理、系统分析师、业务分析师以及可能涉及的最终用户代表和领域专家等。例如&#xff0c;开发一个医疗管理软件&#xff0c;就需要有医疗行业的专家参与&#xff0c;确保对医疗业务流程有深入理解。明确各成员的职责&#xff0c;如系统分…

wordpres当前分类调用父分类的名称和链接

在WordPress中&#xff0c;如果你想在当前分类页面调用并显示父分类的名称和链接&#xff0c;你可以使用以下代码片段&#xff1a; <?php // 获取当前分类的ID $cat_id get_queried_object_id();// 获取当前分类的父分类ID $parent_id get_term($cat_id, category)->…

前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?

《写给前端的python应用指南》系列&#xff1a; &#xff08;一&#xff09;快速构建 Web 服务器 - Flask vs Node.js 对比&#xff08;二&#xff09;深入Flask&#xff1a;理解Flask的应用结构与模块化设计 在上一篇博文中&#xff0c;我们深入探讨了Flask框架&#xff0c;…

网络管理-期末项目(附源码)

环境&#xff1a;网络管理 主机资源监控系统项目搭建 &#xff08;保姆级教程 建议点赞 收藏&#xff09;_搭建网络版信息管理系统-CSDN博客 效果图 下面3个文件的项目目录(python3.8.8的虚拟环境) D:\py_siqintu\myproject5\Scripts\mytest.py D:\py_siqintu\myproject5\Sc…

MySQL 常用程序介绍

以下是一些常用的MySQL程序&#xff1a; 程序名作⽤mysqldMySQL的守护进程即 MySQL 服务器&#xff0c;要使⽤MySQL 服务器 mysqld必须正在运⾏状态mysql MySQL客⼾端程序&#xff0c;⽤于交互式输⼊ SQL 语句或以批处理模式从⽂件执⾏SQL的命令⾏⼯具 mysqlcheck⽤于检查、修…

Redis篇--常见问题篇4--大Key(Big Key,什么是大Key,影响及使用建议)

1、概述 大Key&#xff1a;通常是指值&#xff08;Value&#xff09;的长度非常大&#xff0c;实际上键&#xff08;Key&#xff09;长度很大也算。通常来说&#xff0c;键本身不会很长&#xff0c;占用的内存较少&#xff0c;因此判断一个键是否为bigKey主要看它对应的值的大…

云手机+YouTube:改变通信世界的划时代技术

随着科技的不断进步&#xff0c;手机作为人们生活中不可或缺的工具&#xff0c;也在不断地更新换代。近年来&#xff0c;一个名为“油管云手机”的全新产品正在引起广泛的关注和讨论。作为一个运用最新科技实现的新型手机&#xff0c;它在通信领域带来了全新的体验和革命性的变…

ModbusTCP从站转Profinet主站案例

一. 案例背景 在复杂的工业自动化场景中&#xff0c;企业常常会采用不同品牌的设备来构建生产系统。西门子SINAMICS G120变频器以其高性能、高精度的速度和转矩控制功能&#xff0c;在电机驱动领域应用广泛。施耐德M580可编程逻辑控制器则以强大的逻辑控制和数据处理能力著称&…

JS 函数的定义与调用

文章目录 1. 普通函数-无形参2. 普通函数-有形参3. 普通函数-参数默认值4. 普通函数-返回值5. 立即执行函数6. 匿名函数7. 箭头函数8. 函数提升 1. 普通函数-无形参 函数定义时没有指定形参, 调用时仍然可以向其传递参数, 通过默认参数 arguments 获取, arguments 是一个伪数组…

MySQL的索引失效的原因有那些

1. 数据类型不匹配 详细说明&#xff1a;MySQL在比较不同数据类型的值时&#xff0c;可能会尝试进行隐式转换。如果这种转换导致了复杂度增加或无法直接利用索引&#xff0c;则会导致索引失效。 实例与解决方案&#xff1a; -- 错误示例&#xff1a;数据类型不匹配 select *…

迈向未来:.NET技术的持续创新与发展前景

随着信息技术的飞速发展&#xff0c;编程语言和开发框架不断涌现&#xff0c;许多技术平台以其独特的优势赢得了开发者的青睐。在这场技术的竞争中&#xff0c;.NET平台凭借其卓越的性能、广泛的生态系统以及持续创新的精神&#xff0c;成为了全球开发者的重要选择。本文将探讨…

微信小程序-基于Vant Weapp UI 组件库的Area 省市区选择

Area 省市区选择&#xff0c;省市区选择组件通常与 弹出层 组件配合使用。 areaList 格式 areaList 为对象结构&#xff0c;包含 province_list、city_list、county_list 三个 key。 每项以地区码作为 key&#xff0c;省市区名字作为 value。地区码为 6 位数字&#xff0c;前两…