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

xiaoxiao2021-02-28  28

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

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

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

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

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

具体事例:

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

                 

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

转载请注明原文地址: https://www.6miu.com/read-2500251.html

最新回复(0)