【设计模式】单例模式(Singleton)

  • Singleton模式是设计模式中最为简单、最为常见、最容易实现,也是最应该熟悉和掌握的模式。
  • 公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是Singleton模式。

模式结构

【设计模式】单例模式(Singleton)_第1张图片

  • Singleton模式包含的角色只有一个,就是Singleton。
  • Singleton拥有一个私有构造函数,确保无法通过new直接实例它。
  • Singleton模式包含一个静态私有成员变量instance静态公有方法GetInstance
  • GetInstance方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。

模式代码

using System;

namespace 单例模式
{
    class Singleton
    {
        private static Singleton instance;
        private Singleton() { }
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.GetInstance();
            Singleton s2 = Singleton.GetInstance();
            if(s1==s2)
            {
                Console.WriteLine("Object are the same instance!");
            }
            Console.Read();
        }
    }
}

模式特点

  • 单例模式只能有一个实例
  • 单例模式必须自己创建自己唯一的实例
  • 单例类必须给其他对象提供这一实例

模式分类

  • 懒汉式(时间换空间)
class Singleton
    {
        private static Singleton instance;
        private Singleton() { }
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
  • 饿汉式(空间换时间)
 class Singleton
    {
        private static Singleton instance=new Singleton();
        private Singleton() { }
        public static Singleton GetInstance()
        {
            return instance;
        }
    }

使用情况

使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。反过来,如果一个类可以有几个实例共存,就不要使用单例模式。

本质

控制实例数目

举例

ps:仅代表个人思路

【问题】考虑一个应用,读取配置文件的内存:

  • 很多项目中,都有与应用相关的配置文件,一般是自定义的,在里面定义一些应用需要的参数数据。
  • 多采用xml格式。也有采用properties格式的。
  • 要读取配置文件的内容,如何实现?
    【代码】
//单例类
public class AppConfig {
	private String parameterA;
	private String parameterB;
	private static AppConfig appconfig;

	private AppConfig() {
		readConfig();
	}

	public String getParameterA() {
		return parameterA;
	}

	public String getParameterB() {
		return parameterB;
	}

	public static AppConfig getAppconfig() {
		if (appconfig == null) {
			appconfig = new AppConfig();
		}
		return appconfig;
	}

	private void readConfig() {
		Properties p = new Properties();
		InputStream in = null;
		try {
			in = AppConfig.class.getResourceAsStream("AppConfig.properties");
			p.load(in);
			this.parameterA = p.getProperty("paramA");
			this.parameterB = p.getProperty("paramB");
		} catch (IOException e) {
			System.out.println("装在配置文件出错!");
			e.printStackTrace();
		}finally {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
//客户端类
public class Client {

	public static void main(String[] args) {
		AppConfig a1=AppConfig.getAppconfig();
		AppConfig a2=AppConfig.getAppconfig();
		
		if(a1==a2) {
			System.out.println("两个项目是同一个。");
		}else {
			System.out.println("两个项目是不同的。");
		}
	}
}
//配置文件
//AppConfig.properties
paramA=AAA
paramB=BBB

【UML图】
【设计模式】单例模式(Singleton)_第2张图片

你可能感兴趣的:(设计模式)