`
步行者
  • 浏览: 169828 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

为什么需要Singleton

阅读更多

为什么需要 单例设计模式(Singleton)?

像下面的一个单例

 

public class Singleton {
	private static Singleton instance = null;
	private Singleton(){};
	public static synchronized Singleton getInstance(){
		if(instance == null)
			instance = new Singleton();
		return instance;
	}
	public void doSomething(){
		//do something
	}
}


它要实现的主要目标,就是在一个应用中只维护一个Singleton实例

但一个类在一个应用中也是唯一的,为什么不能直接以类作为单例呢?

 

public final class AnotherSingleton{
	private AnotherSingleton(){}
	public static synchronized void doSomething(){
		//do something
	}
}

 

把类的所有方法都改为静态方法,

所有属性都改为静态属性(我们可以把

静态属性看成类的内部状态),

但是不允许实例化,

对类的操作相当于对单例的操作

而且类也可以维护内部状态(通过静态私有属性)

这完全满足了单例的要求。

不知道为什么需要单例模式。。。


因为我想不出来在什么情况下 单例可以满足需求

而 类 不能。

 

 

 

分享到:
评论
86 楼 visitor 2009-06-11  
类不能作为参数 和 返回值

85 楼 步行者 2009-06-11  
303535576 写道
gthacker 写道
应该还是编程规范的原因

支持这个回复,可能就这个区别了吧
如果用对象应该更面向对象一些


恩 。。。
可能这就是这个区别了吧
不过感觉 静态的 效率更高一些
84 楼 步行者 2009-06-11  
pojo333 写道
看看那些框架的应用!

举个例子。。!
83 楼 pojo333 2009-06-10  
看看那些框架的应用!
82 楼 303535576 2009-06-10  
gthacker 写道
应该还是编程规范的原因

支持这个回复,可能就这个区别了吧
如果用对象应该更面向对象一些
81 楼 步行者 2009-06-10  
(接上个回复)
我觉得类也可以实现数据封装

从资源占用的角度来看,我反而觉得AnotherSingleton
更好一些,因为它不需要实例化对象
80 楼 步行者 2009-06-10  
ywlqi 写道
qzzlw 写道
类的属性是全局的,系统一启动就已经在全局静态数据区分配好了资源,而单例是对象,只有在需要的时候才在堆内分配资源来放置实例属性。从封装的角度或者资源占用的角度来看 ,单例可能会更好一些。

同意!!


前面我已经多次解释了 这个问题
类不是在 系统一启动时 就加载,
而是第一次被引用时加载。。。
还有 难道单例对象的类就不需要加载吗?
79 楼 步行者 2009-06-10  
evabibi 写道
http://www.cnblogs.com/k-eckel/articles/208919.html


楼主自己去看. 


我看了这个帖子
它那里提到 “全局变量不能防止实例化多个对象。”,
可以防止,只要 私有化构造函数,并且把类设为finnal 就可以了
请看我上面回帖中一个更为完整的AnotherSingleton
78 楼 ywlqi 2009-06-10  
qzzlw 写道
类的属性是全局的,系统一启动就已经在全局静态数据区分配好了资源,而单例是对象,只有在需要的时候才在堆内分配资源来放置实例属性。从封装的角度或者资源占用的角度来看 ,单例可能会更好一些。

同意!!
77 楼 gthacker 2009-06-10  
应该还是编程规范的原因
76 楼 evabibi 2009-06-09  
http://www.cnblogs.com/k-eckel/articles/208919.html


楼主自己去看. 
75 楼 visitor 2009-06-09  
一种设计模式 并不像他的代码那么简单
,什么时候用,怎么用才是最重要的
74 楼 visitor 2009-06-09  
关于 Singleton 就讨论出这么多东西
有意思
73 楼 303535576 2009-06-09  
步行者 写道


AnotherSingleton 如果 继承其他类,确实不能利用 父类的非静态方法和属性
因为类不是对象,
但 继承并不是 复用 对象 的唯一手段,还有组合。。


这样,大概了解你的意思了
72 楼 步行者 2009-06-09  
keyboard2000 写道
静态可以代理,可以覆盖,可以重载么?
N多区别啦!


单例不是 关于对象 的概念,而是 关于设计 的概念,
像你说的 跟你的楼上说的大概是一个意思
复用对象有很多途径,除了继承还有组合。

71 楼 步行者 2009-06-09  
303535576 写道
不错 楼主 解释的越来越全面了
但我看了前面的回帖
如果 单例需要继承 其他类怎么办呢
AnotherSingleton 好像就不能满足这方面的要求了


AnotherSingleton 如果 继承其他类,确实不能利用 父类的非静态方法和属性
因为类不是对象,
但 继承并不是 复用 对象 的唯一手段,还有组合。。
70 楼 keyboard2000 2009-06-09  
静态可以代理,可以覆盖,可以重载么?
N多区别啦!
69 楼 303535576 2009-06-09  
不错 楼主 解释的越来越全面了
但我看了前面的回帖
如果 单例需要继承 其他类怎么办呢
AnotherSingleton 好像就不能满足这方面的要求了
68 楼 步行者 2009-06-09  
1,AnotherSingleton 为什么要被定义为 final ,
   为了避免不必要的混淆,因为即使AnotherSingleton
   被继承,运行中AnotherSingleton的子类在内存中并没有
   创建所有静态方法和静态属性的副本,它只是一引用AnotherSingleton
   类的静态属性和静态方法。即应用的状态还是保存在
   AnotherSingleton类中。就像一个Singlton有两个名字,
   我们通过这两个名字都可以引用这个Singlton,没必要,
   这会引起不必要的混淆。

2,AnotherSingleton 的初始化放在
   static{ 
        //initialize AnotherSingleton ... 
    }
   中,类加载时一并初始化 AnotherSingleton 内部状态
   但这会不会增加 JVM 启动时的负载呢,
   不会,因为类在第一次被引用的时候才会被加载,
   不是在 JVM 启动时就加载所有类。
  
67 楼 步行者 2009-06-09  
<p>可能在帖子里写的 AnotherSingleton 过于简单</p>
<p>下面是一个更加全面的 AnotherSingleton</p>
<p> </p>
<p>
</p>
<pre name="code" class="java">public final class AnotherSingleton{
static{
//initialize AnotherSingleton ...
}
private static State innerState;
public static synchronized void changeState(){
//change innerState ...
}
private AnotherSingleton(){}
}</pre>
 
<p> </p>
<p> </p>
<p> </p>

相关推荐

    Singleton

    只有在INSTANCE为null时,才进行同步,这样大多数情况下都不需要同步。 ```java public class Singleton { private volatile static Singleton INSTANCE; private Singleton() {} public static Singleton ...

    C++完美实现Singleton模式

    如果项目中有多个Singleton类需要实现,那么重复的代码将会增多。为了解决这个问题,可以通过模板化Singleton类来减少代码量: ```cpp #pragma once #include using namespace std; using namespace C2217::Win32;...

    Qt qml Singleton 单例模式

    - 如果Singleton需要在C++中初始化,可以使用`setObject`方法在C++侧设置Singleton的实例。 综上所述,Qt Qml的Singleton模式为全局共享对象提供了方便,使得在Qml环境中管理和访问同一对象变得简单。通过C++和Qml...

    C++ 实现的singleton 模式

    // 如果有需要初始化的数据,可以在这里声明 // ... }; ``` 在`Singleton.cpp`中,我们实现`getInstance()`方法: ```cpp #include "Singleton.h" // 单例的静态成员变量,存储唯一实例 Singleton* Singleton::...

    singleton设计模式java实现及对比

    缺点:如果Singleton需要持有外部引用,可能会导致内存泄漏。 综上所述,Singleton模式的实现方式各有优劣,选择哪种方式取决于具体的应用场景和性能需求。在实际开发中,应根据项目需求选择最适合的Singleton实现...

    Singleton Pattern 源码

    单例模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制资源的唯一性、全局配置对象或者缓存服务等。本篇文章将深入探讨...

    Singleton 单例模式

    这种模式常用于系统资源管理,比如数据库连接、线程池或者缓存服务等,因为这些资源往往需要全局共享且控制其生命周期。 单例模式的核心思想在于控制类的构造函数,防止外部直接实例化。通常,我们会将构造函数设为...

    SingleTon的模板(template)化应用

    首先,我们需要理解单例模式的基本思想。单例模式通常包含两个关键点:一是控制类的实例化过程,只允许创建一个实例;二是提供一个全局访问点,使得任何地方都可以获取到这个唯一的实例。传统的C++单例实现可能使用...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java设计模式是面向对象编程中的重要概念,它们是解决常见问题的经验总结,为代码的可重用性、可维护性和可扩展性提供了指导。这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory ...

    linux 下线程安全的singleton

    singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.

    Java 单例模式Singleton

    简单的单例模式举例Singleton 分为恶汉式 懒汉式

    单例模式Singleton

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...

    SingletonTemplate

    在继承SingletonTemplate时,子类只需要关注自己的业务逻辑,无需关心单例的实现细节。这样的设计遵循了“开闭原则”,即对扩展开放,对修改关闭。 在实际编程中,需要注意单例模式的适用场景和潜在问题。虽然单例...

    (创建型模式)Singleton模式

    除了上述实现方式,还需要注意Singleton模式的一些扩展和讨论。例如,Singleton模式破坏了类的封装性,使得类的实例化过程不再由类自身控制,而是外部代码控制。这在某些情况下可能引发问题,比如测试和序列化。为了...

    Laravel开发-singleton-pattern

    Singleton确保一个类只有一个实例,并提供一个全局访问点,这样可以避免创建多个对象导致资源浪费,尤其适用于那些创建开销大或需要全局共享状态的类。 首先,我们要理解什么是单例模式。单例模式是一种创建型设计...

    单例极致 singleton C++

    1、没有构造函数(DEFINE_SINGLETON_DEFAULT); 2、有构造函数,构造函数没有参数(DEFINE_SINGLETON_CONSTRUCT_NO_PARAM); 3、有构造函数,构造函数有没有参数版本(DEFINE_SINGLETON_CONSTRUCT_WITH_DEFAULT)...

    Loki singleton

    然后,你可以为你的类定义一个Singleton模板实例,以确保该类在整个应用程序中只存在一个实例。以下是一个基本的示例: ```cpp #include &lt;Loki/Singleton.h&gt; class MyClass { public: // 确保你的构造函数是私有...

    单例模式Singleton(java源码)

    Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()...

    单例实现源码singleton-C++

    以下是对"单例实现源码singleton-C++"的详细解析。 1. **静态成员变量法** 这是最常见的单例实现方式。在类中定义一个静态成员变量,该变量保存唯一的实例。例如: ```cpp class Singleton { public: static ...

Global site tag (gtag.js) - Google Analytics