设计模式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();
    }
}
相关推荐
nice_lcj52027 分钟前
【从零理解 Spring AI · 14】RAG 的四个环节:加载、切分、向量化、检索
java·spring boot·embedding·向量数据库·rag·spring ai·ai应用开发
SomeOtherTime1 小时前
Rust所有权(AI回答)
开发语言·后端·rust
Easyhood1 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
白杨尚青2 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
学长毕设2 小时前
基于springboot科创竞赛信息平台-附源码
java·spring boot·后端
聪明的笨猪猪3 小时前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
学长毕设3 小时前
基于SpringBoot公务员考试交流平台-附源码
java·spring boot·后端
SL_staff5 小时前
私有化低代码:面向强监管行业的可控数字化实践
java·低代码
饮水桶_T5 小时前
JAVA IO流笔记
开发语言·数据结构·算法
三翼鸟数字化技术团队6 小时前
高性能存储引擎RocksDB:原理与Java生态实践
java