【java设计模式】【创建模式Creational Pattern】单例模式Singleton Pattern
//饿汉式:资源利用率较低(无论是否需要都会创建),性能较高(使用前无需判断实例是否存在,可直接使用)
public class EagerSingleton{
private static final EagerSingleton instance=new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getInstance(){
return instance;
}
}
//懒汉式:资源利用率较高(需要时才创建),性能较低(需要判断实例是否存在)
public class LazySingleton{
private static LazySingleton instance;
private LazySingleton(){}
synchronized/*同步很重要,保证多线程时安全*/ public static LazySingleton getInstance(){
if(instance==null){
instance=new LazySingleton();
}
return instance;
}
}
//这是个错误示例:双重检查成例对java语言编译器不成立,在线程1进入第2个if时,引用instance被创建,
//但可能未来得及被实例化,此时线程2在第1个if时判断引用instance不为空则直接返回instance,但JDK不允许
//返回一个没有实例化的对象,所有会导致系统崩溃。
public class LazySingleton{
private static LazySingleton instance;
private LazySingleton(){}
public static LazySingleton getInstance(){
if(instance==null){
synchronized(LazySingleton.class){
if(instance==null){
System.out.println("LazySingleton.getInstance()");
instance=new LazySingleton();
}
}
}
return instance;
}
}
 package com.tn.pattern;
 import java.util.HashMap;
 public class Client {
     public static void main(String[] args) throws Exception {
         RegSingleton.getInstance(null).print();
         RegSingletonChild.getInstance().print();
     }
 }
 //登记式
 class RegSingleton{
     private static HashMap singletons=new HashMap();
     static{
         RegSingleton instance=new RegSingleton();
         singletons.put(instance.getClass().getName(), instance);
     }
     protected RegSingleton(){}
     public static RegSingleton getInstance(String name){
         if(name==null)
             name="com.tn.pattern.RegSingleton";
         if(singletons.get(name)==null){
             try {
                 singletons.put(name, Class.forName(name).newInstance());
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
         return (RegSingleton)singletons.get(name);
     }
     public void print(){
         System.out.println("RegSingleton.print()");
     }
 }
 class RegSingletonChild extends RegSingleton{
     public RegSingletonChild(){}
     public static RegSingletonChild getInstance(){
         return (RegSingletonChild)RegSingleton.getInstance("com.tn.pattern.RegSingletonChild");
     }
     public void print(){
         System.out.println("RegSingletonChild.print()");
     }
 }
【java设计模式】【创建模式Creational Pattern】单例模式Singleton Pattern的更多相关文章
- JavaScript基础对象创建模式之单体/单例模式(Singleton)
		
首先,单例模式是对象的创建模式之一,此外还包括工厂模式.单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向整个系统公开这个实例接口 Java中大 ...
 - java设计模式 -------- 创建模式 之 抽象工厂模式
		
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...
 - java设计模式--创建模式--原型模式
		
原型模式: 原型模式 概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 .当一个系统应该独立于它的产品创建.构成和表示时. .当要实例化的类是在运行时刻指定时,例如,通过 ...
 - java设计模式--创建模式--建造者模式
		
对于建造者模式,小编个人理解为就是一个组装型的模式. 建造者模式 概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性 1.当创建复杂对象的算法应该独立于该对象的组 ...
 - java设计模式--创建模式--工厂方法
		
工厂方法定义: 工厂方法 概述 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 适用性 .当一个类不知道它所必须创建的对象的类的时候. ...
 - 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性
		
模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...
 - 浅谈设计模式--单例模式(Singleton Pattern)
		
题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...
 - 设计模式之单例模式(Singleton Pattern)
		
单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...
 - 【设计模式】单例模式 Singleton Pattern
		
通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance) 的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...
 - JAVA:将反射技术应用于工厂模式(Factory)和单例模式(Singleton)的简单代码
		
反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton). 参考URL: http://blog.csdn.net/xiaohai79 ...
 
随机推荐
- 熊掌号:"搜索+信息流"双引擎与"百家号+熊掌号"双品牌内容平台
			
一. 熊掌号是什么?熊掌号简单来说,就是"搜索 + 信息流"双引擎与"百家号 + 熊掌号"双品牌内容平台,上线了,对站长还是企业,都是一件好事.只要写出优质的原 ...
 - 用MVC导入导出
			
导入导出对于刚做的人一脸懵逼,但是明白思路之后就感觉非常容易,我也是研究了好久,才总算做了出来,放在这里给大家分享一下 一.先看下导出 视图脚本 <script type ="text ...
 - day01_HTML
			
今日任务 网站信息页面案例 网站图片信息页面案例 网站友情链接页面案例 网站首页案例 网站后台页面案例 教学目标 了解什么是标记语言 了解HTML的框架标签 掌握HTML的主要标签(字体,图片,列表, ...
 - C语言中静态申请内存遇到的错误分析
			
今天调试代码中,遇到了一个比较奇怪的打印,dump出来的数据只有前四位有值,其他后面的都为零. 出于直觉,应该是内存没有申请到.仔细核对代码之后,果真发现了一个语法错误,就是使用指针的指针时 ,对申请 ...
 - ABAP中的AMDP(ABAP-Managed Database Procedures )
			
ABAP管理下的数据库存储过程(ABAP-Managed Database Procedure,以下简称AMDP)是在APAP on SAP HANA开发中的一种优化模式.AMDP使用数据库语言书写, ...
 - 51Nod 1007 正整数分组 01背包
			
将一堆正整数分为2组,要求2组的和相差最小.例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的.Input第1行:一个数N,N为正整数的数量.第2 - ...
 - 51Nod 1110 距离之和最小 V3 中位数 思维
			
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i].点P到点P[i]的带权距离 = 实际距离 ...
 - HDU1248--完全背包
			
寒冰王座 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
 - 一些内存模型、并发、netty知识点的记录
			
happens-before:描述内存可见性as-if-serial:无论怎么重排序,程序的运行结果不会改变 ReentrantLock依赖了队列同步器AQS,其实现方式是volatile变量的读写操 ...
 - AspNet Core :创建自定义 EF Core  链接数据库
			
这两天比较忙,写的会慢一点. 我们以控制台演示 EF Core的链接数据库 首先创建控制台程序 创建数据上下文类 EntityTable /// <summary> /// 继承 DbCo ...