VS2010中wmain入口函数中使用wprintf输出中文乱码问题

生活中的单例

中国(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();
        }
    }
        

  写在后面的话

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

VS2010中wmain入口函数中使用wprintf输出中文乱码问题

时间: 2024-12-11 14:45:02

VS2010中wmain入口函数中使用wprintf输出中文乱码问题的相关文章

Java应用程序中System.out.println输出中文乱码

Java应用程序中System.out.println输出中文乱码 2013-12-10 21:27:08cnblogs.com-bluepoint2009-点击数:3631 其实,解决办法比较简单,即:编译时指定编码为UTF-8,如: 1 javac -encoding utf-8 HelloJava.java 这样,再运行时就不会出现乱码. 一.中文问题的来源 计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理.随着计算机的发

在Servlet中出现一个输出中文乱码的问题(已经解)。

在Servlet中出现一个输出中文乱码的问题,已经解. @Override public void doPost(HttpServletRequest reqeust, HttpServletResponse response) throws ServletException, IOException { //PrintWriter out = response.getWriter();在还没有给response指定编码格式时就获取了他的输出流,所以一直乱码 reqeust.setCharact

PLSQL中查询数据的时候查询结果显示中文乱码

要需要很努力才能看起来毫不费力..... 1.在PLSQL中查询数据的时候查询结果显示中文乱码 2.需要在环境变量中新建两个环境变量: 第一个: 设置 NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 第二个: 设置:LANG=zh_CN.GBK 3.之后重启PLSQL 再重新连接 乱码显示正常

idea中tomcat控制台输出中文乱码问题的解决

idea中tomcat控制台输出中文乱码问题的解决 每次用新的tomcat和idea都会遇到tomcat控制台中文乱码问题,故在此整理. 基本上都是需要修改tomcat的启动参数(如果本身idea编码都统一设置为utf-8了) 打开tomcat下的bin目录,找到catalina.bat文件 找到 JAVA_OPTS 参数,在其中加上 -Dfile.encoding=UTF-8(用的7.0.82版本的设置为UTF-8,8.0.20版本的需要设置为GBK,目前不知道原因,可能是组件的编码有变化)

PHP函数imagefttext( )因--enable-gd-jis-conv引发中文乱码解决方案

阐述 最近几天与公司的PHP开发人员测试即将上线的WEB站点(致难忘的青春岁月:http://hd.gfan.com),在内网测试环境没有任何问题,但在线上测试时,发现通过PHP的GD函数 imagefttext()引用FreeType字体将文本信息写入图像时,出现中文乱码:对此问题,我们在整个排查过程中,总结了三个能引起中文乱码的原因,如下: 1.Linux系统字符集是否支持中文? [email protected]:~#locale LANG=en_US.UTF-8 LANGUAGE=en_

Linux中的入口函数main

main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么?这次我们来探讨一下这个问题. 1. main()函数的形式先来说说main函数的定义,较早开始写C程序的肯定都用过这样的定义void main(){},其实翻翻C/C++标准,从来没有定义过void main().在C标准中main的定义只有两种:        int main(void)   

Delphi 如何解决在DLL的入口函数中创建或结束线程时卡死

先看一下使用Delphi开发DLL时如何使用MAIN函数, 通常情况下并不会使用到DLL的MAIN函数,因为delphi的框架已经把Main函数隐藏起来 而工程函数的 begin  end 默认就是MAIN函数的DLL_PROCESS_ATTACH事件的处理代码,如需要完整的处理其他事件, 如 DLL_PROCESS_DETACH,DLL_THREAD_ATTACH, DLL_THREAD_DETACH,可在工程文件中做如下处理: procedure DLLEntryPoint(Reason:D

setTimeout中所执行函数中的this,永远指向window

注意是要延迟执行的函数中的this哦!! //片段一 setTimeout("alert(this)", 1); // [object Window] //片段二 var obj = { say: function() { setTimeout("alert('in obj ' + this)", 0) } } obj.say(); //片段三 var obj = { say: function() { setTimeout(function(){alert(thi

JS中内嵌函数中this关键字的使用

this关键字的使用 在嵌套函数中:和变量不同,this关键字没有作用域的限制,在嵌套函数的内部使用this关键字可以分为以下两种情况: 1)如果嵌套函数作为方法调用,那么this为当前的上下文. 2)如果当做函数调用,那么this的值依赖于当前使用的是否为严格模式,在非严格模式下,this为全局上下文,否则为undefined. 例如: var test1={ a:1, b:2, fun1:function(){ console.log(“fun1: “ +this);    //this为t