设计模式——单例模式

单例模式,即保证一个类仅可以有一个实例化对象,并且提供一个可以访问它的全局接口。

主要解决的问题:一个全局使用的类频繁的创建与销毁

什么时候使用:想控制实例数目,节省系统资源时

单例模式的实现方式分为两种,懒汉和饿汉

单例模式的实现要点:

  • 全局只有一个static特性实例,同时禁止用户自己声明并定义实例
  • 线程安全
  • 禁止赋值和拷贝
  • 用户使用static成员函数通过接口获取实例

1.懒汉单例模式

不到万不得已就不会去实例化类,也就是说在第一次用到类实例时才会去实例化。访问量较小,甚至可能不回去访问的情况下,采用懒汉模式,这是以时间换空间。

线程不安全的懒汉单例模式:

#include<iostream>
using namespace std;
class Singleidler
{
	public:
	~Singleidler()
	{
		cout<<"destroystructor called"<<endl;
	}
	static Singleidler* get_instance()
	{
		if(ptr_instance==nullptr)
		{
			ptr_instance=new Singleidler;
		}
		return ptr_instance;
	}
	void use() const
	{
		cout<<"using"<<endl;
	}
private:
	Singleidler()
	{
		cout<<"constructor called!"<<endl;
	}
	 Singleidler(const Singleidler&)=delete;//禁止访问拷贝构造
     Singleidler& operator=(const Singleidler&)=delete;//禁止赋值
	 static Singleidler* ptr_instance;
};
Singleidler* Singleidler::ptr_instance=nullptr;
int main()
{
	Singleidler* instance =Singleidler::get_instance();
	Singleidler* instance2 =Singleidler::get_instance();
	return 0;
}

线程安全的懒汉单例模式:

#include <iostream>
#include <memory>
#include <mutex>  
using namespace std;
class Singleidler{
public:
    typedef shared_ptr<Singleidler> Ptr;
    ~Singleidler(){
     cout<<"destructor called!"<<endl;
    }
    Singleidler(Singleidler&)=delete;
    Singleidler& operator=(const Singleidler&)=delete;
    static Ptr get_instance(){

        if(ptr_instance==nullptr){
            lock_guard<mutex> lk(m_mutex);
            if(ptr_instance == nullptr){
              ptr_instance = shared_ptr<Singleidler>(new Singleidler);
            }
            return ptr_instance;
        }
    }


private:
    Singleidler(){
    cout<<"constructor called!"<<endl;
    }
    static Ptr ptr_instance;
    static mutex m_mutex;
};
Singleidler::Ptr Singleidler::ptr_instance = nullptr;
mutex Singleidler::m_mutex;

int main(){
    Singleidler::Ptr instance = Singleidler::get_instance();
    Singleidler::Ptr instance2 = Singleidler::get_instance();
    return 0;
}

2、饿汉单例模式

饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。

class Singleton
{
public:
    static Singleton* getInstance();
private:
    Singleton(){}                                
    Singleton(const Singleton&) = delete;            
    Singleton& operator=(const Singleton&) = delete; 
​
    static Singleton* m_pSingleton;
};
​
Singleton* Singleton::m_pSingleton = new Singleton();
​
Singleton* Singleton::getInstance()
{
    return m_pSingleton;
}

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在现代军事领域,导弹的精确打击能力至关重要,而导弹的飞行轨迹直接影响其命中精度。为了深入研究导弹的飞行特性,本文通过 MATLAB 软件中的 Simulink 工具,对导弹的六自由度三维轨迹进行仿真分析。目标在惯性坐标系下进行匀速或变速机动,导弹采用比例导引法进行追踪。通过建立运动学与动力学模型,模拟导弹的飞行过程,旨在获取导弹的运动轨迹以及与目标的距离变化规律,为导弹的制导与控制研究提供理论支持与数据参考。 目标在惯性坐标系中按照设定的匀速或变速规律进行机动。其运动状态由位置、速度加速度等参数描述,通过数学公式精确表达其在三维空间内的运动轨迹。匀速运动时,目标的速度保持恒定,位置随时间线性变化;变速运动时,引入加速度参数,使目标的运动更具复杂性实战性。 导弹采用比例导引法进行制导。根据比例导引法的基本原理,导弹的加速度与目标与导弹之间的相对位置相对速度成正比。结合导弹的运动学动力学规律,建立导弹的六自由度运动模型。该模型考虑了导弹在三维空间内的平动转动自由度,包括导弹的俯仰、偏航滚转运动,以及相应的速度加速度变化。通过运动学方程描述导弹的位置姿态变化,动力学方程则考虑了导弹的推力、气动力重力等因素对导弹运动的影响,从而全面刻画导弹的飞行特性。 在 MATLAB 的 Simulink 环境下,搭建仿真模型。将目标运动模型导弹运动模型以模块化的方式进行组合,通过信号连接实现目标与导弹之间的信息交互。设置不同的初始条件,如目标导弹的初始位置、速度、加速度等,以及比例导引法中的比例系数等参数。启动仿真后,Simulink 根据模型中的方程参数,实时计算导弹目标的运动状态,并以图形化的方式展示导弹的三维飞行轨迹以及导弹与目标之间的距离变化曲线。通过多次仿真,调整参数,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值