设计模式----单例模式

单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局的访问的方法。

解决方法:让类自身负责保存它的唯一实例。这个类可以保证没有其它实例被创建,并且它可以提供一个访问该实例的方法。

单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

模式的主要优点:提供了对唯一实例的受控访问。由于系统中只存在一个对象,因此可以节约资源,对于一些需要频繁创建和销毁的对象,单例模式无疑可以提高系统的性能。允许可变数目的实例。可以对单例模式进行扩展,设定指定个数的实例对象,即节省系统资源,由解决了由于单例对象共享过多有损性能的问题。

模式的主要缺点:由于单例模式中没有抽象层,因此单例类的扩展有很大困难。单例类的职责过重,在一定程度上违背了单一职责原则。因为单例模式即提供业务方法,又提供了创建对象的方法,将对象功能和创建耦合在一起。

具体事例:

很多应用项目都有配置文件,这些配置文件里面定义一些应用需要的参数数据。

                 

通常客户端使用这个类是通过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


猜你喜欢

转载自blog.csdn.net/archar_saber/article/details/79844203