有人能告诉我一个关于Singleton模式的好例子吗?另外,我有一个疑问,请问以下情况是单身模式:
当我们在局域网中连接多台打印机但只有一台打印机队列?
答案 0 :(得分:8)
Singleton是一种软件模式。
Here是C#中的一个例子。
在LAN上拥有单个队列更多的是硬件/网络设计问题而不是软件概念,因此不太适用。如果您在软件中建模这样的事情并且 确定只有一个队列,那么它将是适用的。
答案 1 :(得分:6)
我使用单例的个人规则是,只有在错误时才会使用,因为有多个实例,而全局访问是必需。我会说打印队列因此不是单身人士的好候选者:因为你不需要全局访问,并且有争议的是,拥有多个是一个错误。事实上,虽然可能有一个“物理”打印队列(例如在某个地方的打印服务器上)并不是应用程序所关心的,但它只需要提交“作业”:
PrintJobScheduler pjs;
pjs.SubmitPrintJob(myPrintJob);
你不需要我想象的PrintJobScheduler
成为单身人士,即使它可能正在与网络某处的“单身”服务进行对话。
答案 2 :(得分:4)
单身人士背后的一般想法是,它是一个对象,拥有多个是没有意义的,并且可能需要在整个程序中访问它。
我最终使用的是程序配置。
我的配置单例中的典型配置包含IP地址,设备名称和系统限制等内容。首次调用时,它将典型地读取配置文件(有时和/或Windows上的系统注册表),并加载在那里找不到的项目的默认值。程序有多个配置是没有意义的,所以所有这些东西应该只读入整个程序一次。此外,配置项可能需要由系统中各种不同的其他类访问。
答案 3 :(得分:4)
在游戏设计中,如果你有一个图形设备句柄或类似的硬件抽象,负责渲染或音频等单一资源,那么它应该是一个单身。
答案 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个对象。它更容易实现,但可能很危险。
我认为打印机队列不是单例模式。
答案 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();
}
}