wxWidgets初学者导引(2)——下载、安装wxWidgets

生活中的单例

中国(China),位于东亚,是一个以华夏文明为主体、中华文化为基础,以汉族为主要民族的统一多民族国家,通用汉语。中国疆域内的各个民族统称为中华民族,龙是中华民族的象征。古老的中国凭借自身的发展依旧美丽的屹立于东方民族之林,闪耀着她动人的光彩,世界上只有一个中国,任何部分都是祖国不可分割的一部分,今天我们的设计模式就从伟大的祖国开始说起---单例模式。

详解单例模式

单例模式是什么?跟我们的祖国有着怎样的关系呢?首先我们来看一下单例,从“单例”字面意思上理解为—一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法。官方定义:确保一个类只有一个实例,并提供一个全局访问点。在学习的过程中,我们需要把握三个主要的关键点,一、某个类只能有一个实例;二、它必须自行创建这个实例;三、它必须自行向整个系统提供这个实例。来看一下单例模式的结构图:

       实现方法

一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

代码实现

第一版(基本代码)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;  

namespace 单例模式基本模型
{
    class Program
    {
        //客户端
        static void Main(string[] args)
        {
            Singleton Instance1 = Singleton.GetInstance();
            Singleton Instance2 = Singleton.GetInstance();  

            if (Instance1 == Instance2)
            {
                Console.WriteLine("两个实例是一模一样的实例。");
            }  

        }
    }
    class Singleton
    {
        private static Singleton instance;  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            //如果实例不存在,则返回一个新实例,否则返回原实例。
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}  

但是上述代码存在一些缺点,线程不安全,多线程情况下,多个线程同时访问Singleton,调用GetInstance()方法,同时判断instance==null,得到真值,导致创建多个实例,这不符合单例模式的基本原则。那我们要怎么办捏,为了解决以上缺点,我们来看改进的代码(一下版本的)

第二版(多线程时的单例)

class Singleton
    {
        private static Singleton instance=null;
        //创建一个静态只读的进程辅助对象
        private static readonly object ProgressLock = new object();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            lock (ProgressLock)
            {  

                if (instance == null)
                {
                    instance = new Singleton();
                }
            }  

            return instance;
        }
    }  

每次调用GetInstance()方法都需要lock,这种做法是会影响性能的,所以我们需要对这个类进行改良。

第三版(双重锁定)

class Singleton
    {
        private static Singleton instance=null;
        //创建一个静态只读的进程辅助对象
        private static readonly object ProgressLock = new object();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                lock (ProgressLock)
                {  

                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }  

            return instance;
        }
    }

上述构造方式只有在实例未被创建的时候才加锁,避免了每次调用GetInstance()方法都加锁损失性能的问题。但是相对于后面的做法,她仍然有着美中不足的地方。

第四版(静态初始化)

//sealed关键字防止派生
    public sealed class Singleton
    {
        //在第一次引用类的成员时创建实例,公共语言运行库负责处理变量的初始化
        private static readonly Singleton instance=new Singleton();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        public static Singleton GetInstance()
        {
            return instance;
        }
    }  

这种方式是在自己被加载时就将自己实例化,称为饿汉式。由于有.NetFramework 进行初始化,所以我们对实例化机制的控制权较少,没办法和其他实现一样实现延迟初始化。在上面三种形式中,您能够在实例化之前使用非默认的构造函数或执行其他任务。

  第五版(完全延迟加载实例化)

public sealed class Singleton
 {
        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            return Nested.instance;
        }
        class Nested
        {
            static Nested()
            {
            }
            internal static readonly Singleton instance = new Singleton();
        }
    }
        

  写在后面的话

前三版编程方法,因为会面临多线程访问安全的问题,需要做双重锁定这样的处理才可以保证安全,但能够在实例化之前使用非默认的构造函数或执行其他任务,第四版(静态初始化方式)是类一加载就实例化的对象,占用系统资源,所以到底实用哪一种方式,视具体情况而定.

wxWidgets初学者导引(2)——下载、安装wxWidgets

时间: 2024-10-12 07:59:24

wxWidgets初学者导引(2)——下载、安装wxWidgets的相关文章

wxWidgets初学者导引(3)——wxWidgets应用程序初体验

wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 3 wxWidgets应用程序初体验 本文中所有的体验,在Code::Blocks中进行. 为了在Code::Blocks中编译运行C++写的wxWidgets程序,需要再做些设置. 首先,需要在环境变量里添加一个wxWidgets根目录环境变量.设置方法类似于2.3

wxWidgets初学者导引(4)——wxWidgets学习资料及利用方法指导

wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 4 wxWidgets学习资料及利用方法指导 初学者常苦于找不到参考资料.实际上,是找不到,不是没有.真正有用的资料,常常也就在手边,只是不知道.有能力熟练地使用一切能用得着的资料,这是水平提高的指标之一.这种能力,同样,也是在实践中获得,而不是有谁为你讲一堂课就能得

wxWidgets初学者导引(1)——前言

wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 1 前言 1.1 关于"导引" 大学中的"C++程序设计"课程,以掌握基本的C++语法,并运用其解决一般的计算问题为目的.学生在学习中编出的程序,在"长相"上,与实际的产品不太一样.我的学生感慨,为何我编程序总是要面对

wxWidgets初学者导引(5)——用wxSmith进行可视化设计

wxWidgets初学者导引全目录   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 5 用wxSmith进行可视化设计 按照第4章的要求看过了相关的书籍,应该具备了通过直接写代码的方式界面程序的能力.而在实际的工程开发中,做界面的工作常通过可视化的操作完成.wxSmith就是这样一个支持wxWidgets快速开发的一个工具,专门用来做界面. wxSm

wxWidgets刚開始学习的人导引(6)——wxWidgets学习材料清单

wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 学习材料清单 wxWidgets的官网:http://www.wxwidgets.org/downloads/ wxWidgets的下载页面:http://www.wxwidgets.org/downloads/ 在线教程<wxWidgets tutoria

wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言2 下载.安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 3 wxWidgets应用程序初体验 本文中全部的体验,在Code::Blocks中进行. 为了在Code::Blocks中编译执行C++写的wxWidgets程序,须要再做些设置. 首先,须要在环境变量里增加一个wxWidgets根文件夹环境变量.设置方法

安装wxWidgets遭遇的两大关卡

早就想体验wxWidgets.这学期的C++课,课时还算充裕,关键是弟子们的实践能跟得上,我希望能让他们也浅尝一把GUI开发.MFC可以选,但既然IDE都用CodeBlocks了,还是选wxWidgets,开源平台到底吧. 要引弟子行,师傅先走一步. 最简单的办法,下载wxPack,直接安装.看到安装需要的空间相当大,有些犹豫,一是没有找到合适的下载源(我的浏览器打不开http://sourceforge.net,估计又是移动宽带不能解析域名,懒得找他们了),二也想体验利用下载的源文件,自己编译

Unity2017.x 版本的下载安装

Unity2017 版本从2017年7月开始正式发布Unity2017.1版本,为了初学者更加清晰明了的掌握全过程,笔者还是以完整的共19个步骤来给大家演示下载与配置安装的全过程,方便广大读者的无障碍学习. 步骤1: 首先在浏览器中键入:http://www.unity3d.com/ 网址,进入官方首页.对于一些重大版本的发布期间,Untiy官方一般会在首页就直接给出下载链接或者按钮.而对于其他时间,则可以通过首页右上角的"获取Unity"等方式进入下载页面,如下图2.1_1 所示.当

Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法

Xcode5.1默认不支持iOS5版本的模拟器开发调试,在OS X Mavericks(10.9.x)下默认只能支持iOS6.1及以上版本的模拟器,在OS X Mountain Lion(10.8.x)下默认只能支持iOS6.0及以上版本的模拟器进行开发和调试,在此条件之下的版本只能使用硬件设备进行开发调试.虽然现在低版本的iOS设备越来越少了,但是有时客户的需求可能会要求我们一定要兼容iOS5(或更低版本)及以上版本,如果我们手头找不到低版本硬件设备用于调试或者完全使用硬件设备而没有对应的模拟