两种项目中可用的单例模式

一个正常的饿汉单例模式

//CEO,饿汉单例模式

public class CEO extends Staff{

private static final CEO mCeo = new CEO();

//构造函数私有

private CEO(){

}

//公有的静态函数,对外暴露获取单例对象的接口

public static CEO getCeo(){

return mCeo;

}

@Override

public void work(){

//管理VP

}

}

这种最简单的单例模式存在资源消耗、线程安全等问题,所以正常开发过程中并不推荐使用这种单例模式。

常见的单例模式还有DCL方式的单例模式、静态内部类单例模式,但这些都会出现反序列化时重新创建对象的问题。

以上单列模式避免对象在被反序列化时重新生成对象,那么必须加入这个方法:

private Object readResolve() throws ObjectSteamException{

return sInstance;

}

下面介绍两种Android项目中常用的单例模式的实现:

枚举单例

public enum SingletonEnum{

  INSTANCE;

  public void doSomething(){

    System.out.println("do.sth.");

  }

}

使用容器实现单例模式

public class SingletonManager{

private static Map<String,Object> objMap = new HashMap<String,Object>();

private SingletonManager(){

}
public static void registerService(String key,Object instance){
if(!objMap.containsKey(key)){
objMap.put(key,instance);
}
}
public static Object getService(String key){
return objMap.get(key);
}
}

单例模式的核心原理都是将构造函数私有化,并且通过静态方法获取一个唯一的实例。

时间: 2025-01-02 14:12:03

两种项目中可用的单例模式的相关文章

使用Maven构建项目---【重点需要掌握:Jetty和Maven两种项目骨架】

maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Jave项目 1.1.创建Jave Project 1.使用mvn archetype:generate命令,如下所示: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -Dinteract

采用EntLib5.0(Unity+Interception+Caching)实现项目中可用的Caching机制

看了园子里很多介绍Caching的文章,多数都只介绍基本机制,对于Cache更新和依赖部分,更是只简单的实现ICacheItemRefreshAction接口,这在实际项目中是远远不够的.实际项目中,至少应该考虑以下3点: 外部数据:通过外部服务,从其他系统取来的数据.我们无法控制,也不知道啥时候会被更新.对于这部分数据,我们采用定时更新的策略,默认1小时更新1次,可配置. 内部数据:系统自己产生的数据,可以完全掌控.对这部分数据,我们实现ICacheItemRefreshAction接口,一旦

spring 注入java.util.Properties 属性两种xml中的配置练习

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util

Python:Django 项目中可用的各种装备和辅助

1 Redis 数据库 2 MySQL 数据库 3 前端服务器 live-server 4 定时任务 django-crontab扩展 5 Docker 容器 --用来运行 FastDFS 分布式文件系统 6 FastDFS分布式文件系统 --包含Tracker server 和 Storage server 7 CKEditor 富文本编辑器 --方便网站运营人员需要录入商品并编辑商品的详情信息 8 定时器 9 celery 异步任务服务器 10 Json web token (JWT) 11

lua中,两种json和table互转方法的效率比较

lua中json和table的互转,是我们在平时开发过程中经常用到的.比如: 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据结构,如table.此时,就会用到table和json格式的互转. 在用lua编写的服务器中,如果我们通过redis来存储数据,由于redis中不存在table这种数据结构,因此,我们可以选择将table转换成json字符串来进行存储.在数据的存取过程中,也会用到table和json格式的互转. 以

JSP中两种include的区别

首先说明这两种都是什么: <%@ include file=”relativeURI”%> 可以叫作静态include(静态包含),是jsp指令中的一种,(JSP指令控制JSP编译器如何去生成servlet(servlet是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容.狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类别,一般情况下,人们将Servlet理解为后者.-维基百科) <js

JSP中的两种include的区别

一.<%@ include file="relativeURI"%>  1.可以叫作静态include(静态包含),是jsp指令中的一种. 2.在JSP页面被转化成servlet之前,和引入的JSP融合到一起,   "先包含,后编译",不会检查所含文件的变化, 3.<%@ include file=""%>指令在编写代码的时候一般放在最顶部,主要附加的是被重用的代码,这里所说的附加是指把源代码原封不动的附加过来,例如在js

JSP 中两种 include 的区别

转自:http://www.cnblogs.com/lazycoding/archive/2011/04/04/two_include.html <%@include file="relativeURI"%> 可以叫作静态include(静态包含),是jsp指令中的一种. <jsp:include page=”relativeURI” flush=”true” />叫作动态include(动态包含),是jsp动作的一种. 引入内容的不同 <%@includ

C#项目中常用到的设计模式

1. 引言 一个项目的通常都是从Demo开始,不断为项目添加新的功能以及重构,也许刚开始的时候代码显得非常凌乱,毫无设计可言.但是随着项目的迭代,往往需要将很多相同功能的代码抽取出来,这也是设计模式的开始.熟练运用设计模式应该是每一个软件开发人员的必备技能.今天给大家介绍几个常用的设计模式. 2. 单例模式 单例模式恐怕是很多开发人员最先接触到的模式之一,可以认为就是一个全局变量.它的初始化过程无非就是一开始就new 一个instance,或者惰性初始化等需要用到的时候new 一个instanc