单例模式入门与使用
2018-02-25 16:06
141 查看
背景介绍
下面是一个读取配置文件的简单程序AppConfigpublic class AppConfig { /** * 用来存放配置文件中参数A的值 */ private String parameterA; /** * 用来存放配置文件中参数B的值 */ private String parameterB; public String getParameterA() { return parameterA; } public String getParameterB() { return parameterB; } /** * 构造方法 */ public AppConfig(){ //调用读取配置文件的方法 readConfig(); } /** * 读取配置文件,把配置文件中的内容读出来设置到属性上 */ private void readConfig(){ // 根据情况,实际编码 } }
客户端调用代码
public class Client { public static void main(String[] args) { //创建读取应用配置的对象 AppConfig config = new AppConfig(); String paramA = config.getParameterA(); String paramB = config.getParameterB(); // 其他操作 } }
客户端在调用AppConfig来读取配置文件时,每次都会new一个对象出来。对于一个系统来说,存在着多个AppConfig对象,也就存在这个多个封装的配置文件信息,严重的浪费这个系统资源。
此时,就可以考虑使用单例模式来进行优化。
模式介绍
单例模式是比较常用的一种模式。顾名思义,也就是在系统运行期间,某个类只存在一个类实例。实现单例
package com.yiguo.singleton; /** * 单例示例 */ public class Singleton { /** * 定义一个变量来存储创建好的类实例 */ private static Singleton uniqueInstance = null; /** * 私有化构造方法,好在内部控制创建实例的数目 */ private Singleton(){ // } /** * 定义一个方法来为客户端提供类实例 * @return 一个Singleton的实例 */ public static synchronized Singleton getInstance(){ //判断存储实例的变量是否有值 if(uniqueInstance == null){ //如果没有,就创建一个类实例,并把值赋值给存储类实例的变量 uniqueInstance = new Singleton(); } //如果有值,那就直接使用 return uniqueInstance; } /** * 示意方法,单例可以有自己的操作 */ public void singletonOperation(){ //功能处理 } /** * 示意属性,单例可以有自己的属性 */ private String singletonData; /** * 示意方法,让外部通过这些方法来访问属性的值 * @return 属性的值 */ public String getSingletonData(){ return singletonData; } }
应用模式
以下代码只展示应用单例模式的地方,未作变动的代码省略。public class AppConfig { /** * 定义一个变量来存储创建好的类实例,直接在这里创建类实例,只会创建一次 */ private static AppConfig instance = new AppConfig(); /** * 定义一个方法来为客户端提供AppConfig类的实例 * @return 一个AppConfig的实例 */ public static AppConfig getInstance(){ return instance; } /** * 私有化构造方法 */ private AppConfig(){ //调用读取配置文件的方法 readConfig(); } /** * 读取配置文件,把配置文件中的内容读出来设置到属性上 */ private void readConfig(){ //操作 } }
客户端调用
public class Client { public static void main(String[] args) { //创建读取应用配置的对象 AppConfig config = AppConfig.getInstance(); } }
本文完整代码,可以参见:https://github.com/TrumanXia/design_patterns
相关文章推荐
- [Silverlight入门系列]使用MVVM模式(5):异步Validation数据验证和INotifyDataErrorInfo接口
- [Silverlight入门系列]使用MVVM模式(7):ViewModel的INotifyPropertyChanged接口实现
- [Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制Storyboard动画?
- [Silverlight入门系列]使用MVVM模式(1):MVVM核心概念
- Opencv入门教程之使用Opencv进行模式识别与分类
- NDatabase 入门,简单使用 增删改查。让NDatabase带你脱离ADO.net,各种SQL 语句,各种DBMS,各种CRM,IOC之类的烦恼。我们也不需要仓库设计模式了,你妹的。不要表了,不要设计数据库字段了。就这样!
- [Silverlight入门系列]使用MVVM模式(2):集合Model /ObservableCollection/ICollectionView
- 微信公众号入门学习1_使用C#,ASP.NET APIController如何公众号接入服务器并启动开发者模式
- 游戏编程入门(19):使用演示模式展示游戏
- vim的使用技巧--模式入门
- Mybatis入门到精通-5、使用Mapper代理模式
- RabbitMQ入门及常用的5种模式的简单使用(一)
- RabbitMQ入门及常用的5种模式的简单使用(二)
- STLport-5.2.1 STL port配置; cl.exe 编译cpp:ms和cygwin两种模式;cygwin环境配置和使用、GCC编译入门
- Silverlight入门系列]使用MVVM模式
- Spark2.1.0 + CarbonData1.0.0集群模式部署及使用入门
- [Silverlight入门系列]使用MVVM模式(6):使用Behavior
- Spark2.1.0 + CarbonData1.0.0集群模式部署及使用入门
- [Silverlight入门系列]使用MVVM模式(4):Prism的NotificationObject自动实现INotifyPropertyChanged接口
- [Silverlight入门系列]使用MVVM模式(4):Prism的