静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
静态类和单例模式之间存在什么实际的区别?
两者都可以在没有实例化的情况下调用,两者都只提供一个“实例”,而且都不是线程安全的。还有其他区别吗?
当前回答
延迟加载支持接口,以便提供单独的实现能够返回派生类型(作为lazyloading和接口实现的组合)
其他回答
真正的答案是Jon Skeet在这里的另一个论坛上给出的。
单例允许访问单个已创建实例-该实例(或而是对该实例的引用)可以作为参数传递给其他方法,并视为正常对象静态类只允许静态方法。
为了说明Jon的观点,如果Logger是一个静态类,下面所示的操作是无法完成的。类SomeClass希望ILogger实现的一个实例传递到其构造函数中。
Singleton类对于实现依赖注入非常重要。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var someClass = new SomeClass(Logger.GetLogger());
}
}
public class SomeClass
{
public SomeClass(ILogger MyLogger)
{
}
}
public class Logger : ILogger
{
private static Logger _logger;
private Logger() { }
public static Logger GetLogger()
{
if (_logger==null)
{
_logger = new Logger();
}
return _logger;
}
public void Log()
{
}
}
public interface ILogger
{
void Log();
}
}
我将努力超越WTMI和WTL;DR响应。
单身者是一个物体的实例。。。句点
你的问题基本上是问类和该类的实例之间的区别。我认为这很清楚,不需要详细说明。
singleton的类通常采取步骤来确保构建一个实例;这很聪明,但不是必须的。
示例:var connection=connection.Instance;
假设这是Connection类:
public sealed class Connection
{
static readonly Connection _instance = new Connection();
private Connection()
{
}
public static Connection Instance
{
get
{
return _instance;
}
}
}
请注意,您可以在该类上抛出一个接口并模拟它以进行测试,这是静态类无法轻易做到的。
Java中的静态类只有静态方法。这是一个集装箱功能。它是基于程序编程设计创建的。
Singleton类是面向对象设计中的一种模式。单身汉类在JVM中只有一个对象实例。这种模式是以始终只有一个实例的方式实现JVM中存在的类。
静态类示例
public class Any {
private static Any instance = new Any();
private Singleton() {
System.out.println("creating");
}
}
单例模式只存在一个实例:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
System.out.println("creating");
if (instance != null) {
throw new RuntimeException("Imposible create a new instance ");
}
}
}