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

一、单例模式

1.情景

连接字符串管理

2.好处

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

3.Demo

cs 复制代码
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

cs 复制代码
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();
        else
            throw new ArgumentException("Invalid product type");
    }
}

class Program
{
    static void Main()
    {
        
        //客户端使用:先用简单工厂创建对象,然后再用这个对象调用方法
        Product productA = ProductFactory.CreateProduct("A");
        productA.Show();

        Product productB = ProductFactory.CreateProduct("B");
        productB.Show();
    }
}
相关推荐
Elastic 中国社区官方博客13 分钟前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn18825 分钟前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn1 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
y1su1 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
传奇开心果编程2 小时前
【Rust入门练中学】第5课:引用与借用
开发语言·rust·引用·编程语言理论·通用编程语言·借用
qetfw2 小时前
Bash 变量:export、位置参数与默认值展开验证
linux·开发语言·chrome·bash
电子云与长程纠缠2 小时前
UE5魂系游戏开发教程05
开发语言·学习·游戏·ui·ue5
cspttty2 小时前
2027风险管理岗准备路线:数学与应用数学如何补齐金融、SQL与Python
开发语言·python·金融
我命由我123453 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
苜蓿muxu3 小时前
Java 字符串拼接:+、StringBuilder、StringBuffer的区别
java