为带有参数的类创建一个单例工厂

2023-12-27

首先,我在一个网站上读到了这篇文章article http://csharpindepth.com/- 这基本上告诉我我根本不应该使用单例 -

最常见的是,单例不允许在创建实例时指定任何参数 - 否则对实例的第二次请求但使用不同的参数可能会出现问题! (如果所有具有相同参数的请求都应该访问同一个实例,那么工厂模式更合适。)

由于我需要参数以及具有相同参数的相同实例 - 我得出的结论是我需要一个工厂模式。

但我无法在任何地方找到好的工厂模式实现。

如果您发现任何好的带参数的 C# 单例工厂模式实现,请指导我

好吧,我将尝试在这里非常具体......希望这可以解释我的情况。

最受欢迎的是替代方法。我只是结合了很多实现 - 我的理解可能不正确。

所以我有课'A'。它是一个用于连接数据库的类——数据库连接。

连接需要 4 个参数,约束条件为:

  1. 我需要有多个可能的连接 - 使用不同的数据库(参数不同)

  2. 我只需要特定连接的 1 个实例 - 参数相同的单例(以我的理解)

  3. 我需要一个工厂模型,按照上面提到的文章,还需要限制连接数量,超时后关闭连接等。

在此基础上,我需要一个带有参数/参数的单例工厂......我假设

所以 A 类看起来像这样

<which access modifier ?> Class A {
    private Class A(string hostname, string port, string username, string pw_hash) {
        //create a new instance with the specified parameters
    }
    //other methods on the connection
    protected void close() {
        //close the connection
    }
}

public class AFactory//should it inherit class A?? {

        private IList<A> connections = new List<A>();
        private AFactory()
        {
            //do something
        }
        private static readonly Lazy<AFactory> lazy
            = new Lazy<AFactory>(() => new AFactory());

        public static AFactory Instance { get { return lazy.Value; } }

        public A getA(string hostname, string service, string username, string pw_hash)
        {
            foreach (A a in A)
            {
                if (a.hostname == hostname && a.service == service && a.username == username)
                    return a;
            }
            A d = new A(hostname, service, username, pw_hash);
            connections.Add(d);
            return d;
        }

现在,只要 A 类构造函数是公共的,它就可以很好地工作 - 但它有点违背了单例的目的。 我需要做什么才能让这段代码正常工作。

对于指定的参数,我只需要 1 个 A 类实例。

Thanks

Indrajit


工厂用于生成对象而不是管理对象。我认为数据库连接管理器更适合您的情况。您可以将管理器声明为单例。对于单独的连接,您可以使用内部类/结构。

请参阅下面的示例:

class DBConnectionManager
{        
    struct Connection
    {
      public string Hostname;
      public string ServerName;
      public string UserName;
      public string Password;

      public void Connect()
      {
      }

      public void Close()
      {
      } 
    }

    private static s_instance;
    public static DBConnectionManager Instance
    {
        get {return s_instance; }
    }

    private List<Connection> m_connections;

    public Connection GetConnection(string hostname, string serverName, string userName, string password)
    {
        // if already exist in m_connections
        // return the connection
        // otherwise create new connection and add to m_connections    
    }

    public void CloseConnection(string hostname, string serverName, string userName, string password)
    {
        // if find it in m_connections
        // then call Close()
    }

    public void CloseAll()
    {
        //
    }        
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为带有参数的类创建一个单例工厂 的相关文章

  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐