`
冰加盐
  • 浏览: 46563 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

使用私有构造函数强化singleton属性

JVM 
阅读更多

使用私有构造函数强化singleton属性:

实现singleton有两种方法:这两种方法都要把构造函数保持为私有的,并且提供一个静态成员,以便允许客户能够访问该类唯一的实例:

第一种方法:

public class Elvis{

public static final Elvis INSTANCE = new Elvis();

 

private Elvis(){

...

}

...//Remainder omitted

}

第二种方法:

提供了一个公有的静态工厂方法,而不是公有的静态final域;

public class Elvis{

 

private static final Elvis INSTANCE = new Elvis();

 

private Elvis(){

...

}

 

public static Elvis genInstance(){

return INSTANCE;

}

...Remainder omitted

}

所有对于静态方法Elvis.getInstance()的调用,都会返回同一个对象引用,所以,不会有别的Elvis实例被创建。

第一种方法的好处在于,组成类的成员的声明很清楚地表明了这个类是一个singleton;公有的静态域是final的,所以该域将总是包含相同的对象引用。第一种方法可能在性能上稍微领先,但是在第二种方法中,一个优秀的JVM实现应该能够通过将静态工厂方法的调用内联化(inlining),来消除这种差别。

 

第二种方法的好处在于,它提供了灵活性;在不改变API的前提下,允许我们改变想法,把该类做出singleton,或者不做成singleton,singleton静态工厂方法返回该类的唯一实例,但是,他也很容易被修改,比如说,为每个调用方法的线程返回一个唯一的实例。

分享到:
评论

相关推荐

    单例模式Singleton(java源码)

    Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中...

    Flutter中EventBus的使用

    参考文档:电梯直达 ... /// 私有构造函数 EventBus._internal(); /// 保存单例 static EventBus _singleton = new EventBus._internal(); /// 工厂构造函数 factory EventBus() => _singleton; /// 保

    singletonpattern--单件模式

    将对象的构造函数与copy构造函数声明为私有,那么只能通过类的成员函数或者是友元函数来调用构造函数,那么这里我们将只提供一个友元函数来调用该类的私有构造函数,那么如何确保实例化只有一个呢?干脆声明一个静态

    C#单例模式(Singleton Pattern)详解

    A:1)首先必须将构造函数变为私有从而防止其他类实例化,并且只能有一个构造函数。因为系统会默认一个无参构造函数,而且默认public访问修饰符。 所以必须写一个私有无参让默认无效。(通常单例模式都是不带形参的)...

    javascript 单例/单体模式(Singleton)

    单例模式的三个特点: 1,该类只有一个... //私有的构造子(构造器,构造函数,构造方法) private Singleton(){} //公开,静态的工厂方法 public static Singleton getInstance() { return instance; } } 使用时 代码如

    .NET c# 单体模式(Singleton)

    创建一个单体模式类,必须符合三个条件: 1:私有构造函数(防止其他对象创建实例); 2:一个单体类型的私有变量; 3:静态全局获取接口 下面我写一个类,为了看是不是单体,就加了一个计数器,如果是同一个类,...

    在WPF中以Singleton而不是My Singleton进行思考

    这是我最喜欢的单例类,该类提供一个只有私有构造函数的类。

    kmitl-esd-exercise1-60090021-Nipat

    简单实现:使用私有构造函数 注册表实现: 用于注册和注销CompanyManager的注册表 注册表的接口,无法实例化,因此客户端无法创建自己的接口 具体类用于实例化单例 #复合模式 组件:BusinessUnit 具有所有共享的...

    C#单例类的实现方法

    单例类保证一个类全局仅有一个实例,并提供一个全局访问点,由于只能生成一个实例,因此我们必须把构造函数设为私有函数以禁止他人创建实例。 实现1:懒汉式,线程不安全 该实现没有额外开销,不要求线程安全的情况...

    一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举)

    懒汉式优化-加锁同步3.DCL双检锁/双重校验锁重排序问题多线程执行时序表volatile 作用优化-基于volatile 的双重检查锁4.IODH按需初始化持有者反射问题私有构造函数异常处理5.枚举实现单例使用推荐 什么是单例? 单例...

    spring基础

    Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 @Autowired 按照类型来装配 改变如下: package com.baobaotao; import org.springframework.beans....

    java面试800题

    构造函数是和类同名的函数,没有返回类型,构造函数不能在普通的程序里面调用,只有当这个类被应用new实例化的时候才会被运行。构造函数没有返回类型,实际上,构造函数返回的就是这个class本身。 类初始化时构造函数...

    100-words-design-patterns-java:GoF设计模式,每个模式都描述了真实生活中的故事

    官方网站: Java中的100个单词GoF设计模式 介绍 想法:以一种简单的方式描述GoF...如果我们实现一个默认构造函数的作用域为“私有”的类,则只有该类中的方法可以调用该构造函数,这意味着我们无法从其他类中实例化

    java简易投票系统源码下载-DesignModeDemo:23种设计模式swift实现

    DesignModeDemo 23种设计模式swift实现 一、设计模式七大原则(有些地方使用六大原则,没有第六调,此处主要是总结,用于学习) ...关键代码:构造函数是私有的。 应用实例: 使用场景: 1、要求生产唯一序列号。 2、创

    JAVA面试题最全集

    给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46.访问修饰符“public/private/protected/缺省的修饰符”的使用 47.用关键字final修饰一个类或者方法时,有何意义? 48.掌握类和...

    asp.net知识库

    静态构造函数 忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何...

    【05-面向对象(下)】

    我们把该类的构造器使用Private修饰,从而把该 类的所有构造器隐藏起来。  –2.则需要提供一个public方法作为该类的访问点,用于创建该类的对象,且必须使用static修饰  –3.该类还必须缓存已经创建的对象,必须...

    net学习笔记及其他代码应用

    抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 41.构造器Constructor是否可被override? 答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被...

    超级有影响力霸气的Java面试题大全文档

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。  接口(interface...

Global site tag (gtag.js) - Google Analytics