单身模式的例子

时间:2010-04-06 13:15:30

标签: singleton

有人能告诉我一个关于Singleton模式的好例子吗?另外,我有一个疑问,请问以下情况是单身模式:

当我们在局域网中连接多台打印机但只有一台打印机队列?

13 个答案:

答案 0 :(得分:8)

Singleton是一种软件模式。

Here是C#中的一个例子。

在LAN上拥有单个队列更多的是硬件/网络设计问题而不是软件概念,因此不太适用。如果您在软件中建模这样的事情并且 确定只有一个队列,那么它将是适用的。

答案 1 :(得分:6)

我使用单例的个人规则是,只有在错误时才会使用,因为有多个实例,而全局访问是必需。我会说打印队列因此是单身人士的好候选者:因为你不需要全局访问,并且有争议的是,拥有多个是一个错误。事实上,虽然可能有一个“物理”打印队列(例如在某个地方的打印服务器上)并不是应用程序所关心的,但它只需要提交“作业”:

PrintJobScheduler pjs;
pjs.SubmitPrintJob(myPrintJob);

你不需要我想象的PrintJobScheduler成为单身人士,即使它可能正在与网络某处的“单身”服务进行对话。

答案 2 :(得分:4)

单身人士背后的一般想法是,它是一个对象,拥有多个是没有意义的,并且可能需要在整个程序中访问它。

我最终使用的是程序配置

我的配置单例中的典型配置包含IP地址,设备名称和系统限制等内容。首次调用时,它将典型地读取配置文件(有时和/或Windows上的系统注册表),并加载在那里找不到的项目的默认值。程序有多个配置是没有意义的,所以所有这些东西应该只读入整个程序一次。此外,配置项可能需要由系统中各种不同的其他类访问。​​

答案 3 :(得分:4)

在游戏设计中,如果你有一个图形设备句柄或类似的硬件抽象,负责渲染或音频等单一资源,那么它应该是一个单身。

至少that's what I was told.

答案 4 :(得分:2)

HTTP响应可能是一个很好的例子。您不希望有两个或更多实例发送矛盾的标题。

答案 5 :(得分:2)

class Singleton
{
    #region Subj Implementation

    private Singleton() { }
    private static readonly Lazy<Singleton> _lazyInit = new Lazy<Singleton>
        (() => new Singleton());
    public static Singleton Instance { get { return _lazyInit.Value; } }

    #endregion
}

答案 6 :(得分:2)

如果我在一个文件夹中有很多电影,我选择全部并按回车键,然后创建多个播放器实例(您正在使用的媒体播放器),这导致使用资源,因此应该创建singelton设计模式只有一个例子。

答案 7 :(得分:1)

Singleton模式控制对象创建。它保证在任何给定的时间点仅存在1个对象。它更容易实现,但可能很危险。

  1. 此类物体的GC很难。
  2. 难以测试
  3. 我认为打印机队列不是单例模式。

答案 8 :(得分:1)

我见过的单例模式中最好的例子之一(在现实生活中)是.NET中的SQL连接池。

如果你想查看代码,你必须弹出Reflector ...但是Singleton会跟踪所有可用的连接,并在它们可用时将它们移出。

至于你的例子,它有点模糊。每台打印机上的文档队列可能是一个更好的例子。当文档进入打印机时,它们将被放入队列中。然后,在打印机上运行的每个进程都会从Singleton队列中获取文档(而不是为其线程创建自己的队列)。

答案 9 :(得分:1)

关于单身人士模式的this文章中给出的一些例子。

答案 10 :(得分:1)

Singleton模式是Java中最简单的模式,处于创造模式下。 在单例模式中要使用的一些关键点。

  • 本质上是静态的
  • 私有构造函数
  • 该类的私有静态实例
  • 公共静态获取方法
  • 构造函数无参数

创建单例课程

public class Singleton {

    private static Singleton object = null;

    private Singleton() {
    }
    public static Singleton getInstance() {
        if (object == null) {
            object = new Singleton();
        }
        return object;
    }
    public void showMessage() {
        System.out.println("Singleton Pattern");
    }
}

创建演示类

public class Demo {
    public static void main(String[] args) {
        Singleton object = Singleton.getInstance();
        object.showMessage();
    }
}

但是这种经典的实现不是线程安全的。因此,使用同步确保一个线程可以一次执行getInstance();

就这样;

public class Singleton {

    private static Singleton object = null;

    private Singleton() {
    }
    public static synchronized Singleton getInstance() {
        if (object == null) {
            object = new Singleton();
        }
        return object;
    }

}

答案 11 :(得分:0)

以下是建议的 5 种可能的单例类型中的 4 种的示例代码:http://javabeat.net/spring-singleton-java-singleton/

// Java code for Bill Pugh Singleton Implementaion
class GFG 
{
  private GFG() {}
  private static class BillPughSingleton
  {
    private static final GFG INSTANCE = new GFG();
  }
  public static GFG getInstance() 
  {
    // loads instance of inner class lazily instead of needing to check for null
    return BillPughSingleton.INSTANCE;
  }
}

// Singleton Handling Exception
class HFH 
{
  public static HFH INSTANCE;
  private HFH() { }
  static {
    INSTANCE = new HFH();
  }
}

// double check locking
class DCL 
{
  private static DCL INSTANCE;
  private DCL() { }
  public static DCL getInstance()
  {
    if (INSTANCE == null) 
    {
      //synchronized block to remove overhead from sychronizing method
      synchronized (DCL.class)
      {
        if(INSTANCE==null)
        {
          INSTANCE = new DCL();
        }
      }
    }
    return INSTANCE;
  }
}

enum EnumSingleton {
    INSTANCE("Instance Text"); 
    private String info;
    private EnumSingleton(String info) {
        this.info = info;
    }
    public EnumSingleton getInstance() {
        return INSTANCE;
    }
    @Override 
    public String toString() { 
      return info; 
    }
}

class Main {
  public static void main(String... args) {
    GFG bps = GFG.getInstance();
    System.out.println(bps);
    HFH hfh = HFH.INSTANCE;
    System.out.println(hfh);
    DCL dcl = DCL.getInstance();
    System.out.println(dcl);
    EnumSingleton es = EnumSingleton.INSTANCE;
    System.out.println(es.toString());
    System.out.println("Done.");
  }
  
}

答案 12 :(得分:-1)

class singleton{

    public static singleton obj = null;     
    protected singleton(){  }

    public static singleton getObj(){           
        if(obj == null){                
                obj =  new singleton();             
            }           
        return obj;     
    }       
}

public class First {
  public static void main(String[] args) {      
        singleton ss = singleton.getObj();      
    }
}