单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局的访问的方法。
解决方法:让类自身负责保存它的唯一实例。这个类可以保证没有其它实例被创建,并且它可以提供一个访问该实例的方法。
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
模式的主要优点:提供了对唯一实例的受控访问。由于系统中只存在一个对象,因此可以节约资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。允许可变数目的实例。可以对单例模式进行扩展,设定指定个数的实例对象,即节省系统资源,由解决了由于单例对象共享过多有损性能的问题。
模式的主要缺点:由于单例模式中没有抽象层,因此单例类的扩展有很大困难。单例类的职责过重,在一定程度上违背了单一职责原则。因为单例模式即提供业务方法,又提供了创建对象的方法,将对象功能和创建耦合在一起。
具体事例:
很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。
通常客户端使用这个类是通过new一个AppConfig的实例来得到一个操作配置文件内容的对象。如果在系统运行中,有很多地方都需要使用配置文件的内容,系统中会同时存在多份配置文件的内容,这会严重浪费内存资源。
事实上,对于AppConfig类,在运行期间,只需要一个对象实例就够了。那么应该怎么实现呢?
用java实现:
public class Singleton {
private String ParameterA;
private static Singleton instance = null;
private Singleton(){};
public static Singleton getInstance()
{
if(instance == null)
{
instance = new Singleton();
}
return instance;
}
public String GetParameterA()
{
return ParameterA;
}
public void SarameterA(String a)
{
ParameterA=a;
}
public static void main(String[] args)
{
Singleton first = Singleton.getInstance();
Singleton second = Singleton.getInstance();
if(first.equals(second))
{
System.out.println("first和second代表同一个实例");
}
else
{
System.out.println("first和second不是同一个实例");
}
}
}
JAVA里面new()返回的是对象,所以可以直接在类里面直接定义一个static类对象,但是换成c++里面new()返回的是指针,在类里面定义的static类指针需要初始化,但是不能初始化为NULL。我感觉我陷入僵局了。
据说c++ 11可以这样直接实现
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
class Singleton{
public :
Singleton(){}//构造函数private,不能外界new创建对象
Singleton(Singleton&a) = delete;
Singleton(Singleton&&a) = delete;
static Singleton& GetInstance(){
static Singleton instance;
return instance;
}
};
int main()
{
Singleton& s1 = Singleton::GetInstance();
Singleton& s2 = Singleton::GetInstance();
if (&s1 == &s2)
cout << "the same!" << endl;
else
cout << "the different" <<"s1's adress is %d"<<&s1<<"s2's adress is %d"<<&s2<< endl;
system("pause");
return 0;
}
c++和JAVA的写法,差别还是蛮大的T.T