Java 构造结构私有化

单例设计模式:(Singleton)

在一般情况下,一个类只有通过产生对象之后才可以操作这个类。

class Singleton {

public void print() {

System.out.println("Hello,world!") ;

}

}

public class TestDemo {

public static void main(String [] args) {

Singleton s = null ;  //声明对象

s = new Singleton() ; //实例化对象

s.print() ;

}

}

在Singleton类中,实际上存在构造方法【Java规定,没有定义一个构造的化,Javac编译后会自动生成一个无参构造方法】

class Singleton {

private Singlenton() { } //构造方法私有化

public void print() {

System.out.println("Hello,world!") ;

}

}

public class TestDemo {

public static void main(String [] args) {

Singleton s = null ;  //声明对象

s = new Singleton() ; //实例化对象

s.print() ;

}

}

一旦构造方法私有化,在外部将无法直接new实例化对象操作

在构造方法使用private声明,使得构造私有化,无法被外部调用(即无法实例化);既然无法在外部调用,则可以在类的内容调用;

class Singleton {

Singleton instance = new Singleton() ; //new实例化Singleton对象

private Singlenton() {} //构造方法私有化

public void print() {

System.out.println("Hello,world!") ;

}

}

现在的instance在Singleton里面只是一个普通的类属性,而所有的普通类属性必须在类产生实例化对象之后才可以使用,但是否可以存在一种属性,可以让类属性不受Singleton类的实例化对象的控制;如果使用 static 声明 instance 属性,那么就表示可以在一个类没有产生实例化对象的时候,直接使用该属性

public class TestDemo {

public static void main(String [] args) {

Singleton s = null ;  //声明对象

s = Singleton.instance ; //直接访问static声明的类属性

s.print() ;

}

}

在类定义时,类属性需要进行封装;而一旦封装属性之后,只可以通过getter方法来实现访问属性,由此需要提供一个geter方法不受到类的new实例化控制;可以使用static属性继续声明该方法。

class Singleton {

static Singleton instance = new Singleton() ; //new实例化Singleton对象

private void Singlenton() {

return ;

} //构造方法私有化

public static Singleton getInstance() {

return instance ;

} //方法中返回了static声明不受实例化影响的类属性

public void print() {

System.out.println("Hello,world!") ;

}

}

public class TestDemo {

public static void main(String [] args) {

Singleton s = null ;  //声明对象

s = Singleton.getInstance(); //访问static声明的方法

s.print() ;

}

}

上述代码和public普通(非私有)构造的区别:

上述代码所创建的类,或者创建多个类对象,实际上创建的对象是同一个,因为同一个的那个唯一性的对象是在类中创建的,而外部调用的只不过是类中声明实例化的一个对象而已。

上述代码的意义:

如果需要控制一个类中实例化对象的产生个数,必须将构造给private私有化(锁住类中的构造方法)因为在实例化新对象的时候都要使用构造方法,如果构造方法私有化,自然无法直接产生新的实例化对象,既然只需要一个实例化对象,由此可以在类的内部定义一个公共对象,并且每一次通过static方法返回唯一的一个对象,这样外部不管是多少次的调用,最终的类只能产生唯一的对象,这样的设计属于单例设计模式

如果在static声明的方法中,返回的不是唯一的实例化对象的类属性,而是在方法中直接返回实例化对象,结果就是,每一个返回的对象都不是唯一的;为了防止这种情况发生,可以在instance类属性定义的时候,定义为 final 属性,加上final属性后,唯一性更加强烈。

完整的单例设计模式Demo:

class Singleton {

private static  final Singleton          INSTANCE = new Singleton() ; //new实例化Singleton对象

private void Singlenton() {

return ;

} //构造方法私有化

public static Singleton getInstance() {

return INSTANCE ;

}

public void print() {

System.out.println("Hello,world!") ;

}

}

public class TestDemo {

public static void main(String [] args) {

Singleton s = null ;  //声明对象

s = Singleton.getInstance(); //访问static声明的方法

s.print() ;

}

}

单例设计模式的特点:

构造方法私有化,在类的内部定义static属性与方法,利用static方法取得本类中的实例化对象,由此,无乱外部产生多少个Singleton对象,但是本质上通过static方法获得的类实例化对象都是同一个(唯一的一个)

         核心目的:让一个在整个系统中只存在一个实例化对象

单例设计的两种形式:

饿汉式:不管是否使用;在定义static的类属性时就直接实例化对象

懒汉式:只有第一次使用的时候,才会实例化操作;在定义static类属性的时候不会实例化对象,而是在第一次调用类属性的时候,if判断类属性是否为null,为null则实例化;

多例设计模式:

多例设计模式可以让一个类产生指定多个实例化对象;例如定义一个表示一周时间数的类,这个类只有七个实例化对象;定义表示性别的类,这个类只能有两个实例对象;

定义表示性别的类:

class Sex {

private String title ;

private static final Sex MALE = new Sex("男") ;

         private static final Sex FEMALE = new Sex("女") ;

private Sex(String title) {

this.title = title ;

}

public String toString() {

return this.title ;

}

public static Sex getInstance(int ch) {

                   switch ( ch ) {

                            case 1 : return MALE ;

                            case 2 : return FEMALE ;

                            default : return null ;              

                   }

}

}

public class TestDemo {

public static void main(String [] args) {

Sex s = null ;  //声明对象

s = Sex.getInstance(2);

System.out.println(s)

}

}

多例设计模式的一个目的:

在一个类中产生多个对象,根据不同的请求,获得不同的实例化对象。

不管设计模式如何,核心就是构造方法私有化!

Java 构造结构私有化的更多相关文章

  1. Java内存结构、类的初始化、及对象构造过程

    概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...

  2. Java虚拟机 - 结构原理与运行时数据区域

    http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...

  3. Java 语言结构【转】

    Java 语言结构 基础:包(Package).类(Class)和对象(Object) 了解 Java 的包(Package).类(Class)和对象(Object)这些基础术语是非常重要的,这部分内 ...

  4. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  5. Java 内存结构备忘录

    本文详细描述了 Java 堆内存模型,垃圾回收算法以及处理内存泄露的最佳方案,并辅之以图表,希望能对理解 Java 内存结构有所帮助.原文作者 Sumith Puri,本文系 OneAPM 工程师编译 ...

  6. 使用递归算法结合数据库解析成java树形结构

    使用递归算法结合数据库解析成java树形结构 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHA ...

  7. JAVA循环结构

    JAVA循环结构:顺序结构只能执行一次,如果要执行多次需要用到循环 JAVA中的循环结构有while:do...while:for: 1.while循环:先判断布尔表达式中的值,若为true,执行循环 ...

  8. JVM规范系列第2章:Java虚拟机结构

    本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为 ...

  9. java内存结构学习的一种打开方式

    用Java开发已经四年,中途学了python,Scala,接触这些开发语言后,总感觉Java就像老奶奶裹脚——又臭又长.然,Java虐我千百遍,我待Java如初恋.聊起Java,不得不谈Java的内存 ...

随机推荐

  1. [Spring cloud 一步步实现广告系统] 7. 中期总结回顾

    在前面的过程中,我们创建了4个project: 服务发现 我们使用Eureka 作为服务发现组件,学习了Eureka Server,Eureka Client的使用. Eureka Server 加依 ...

  2. Python爬虫,你是否真的了解它?

    程序员有时候很难和外行人讲明白自己的工作是什么,甚至有些时候,跟同行的人讲清楚“你是干什么的”也很困难.比如我自己,就对Daivd在搞的语义网一头雾水.所以我打算写一篇博客,讲一下“爬虫工程师”的工作 ...

  3. 「SAP技术」SAP HU上面的'Obj.to Which HU Belongs'栏位初探

    SAP HU上面的'Obj.to Which HU Belongs'栏位初探 HU02,创建一个新的HU, 保存之, HU03显示这个HU 189141203942, 其'obj.to Which H ...

  4. WordPress疑难问题以及解决方案汇总

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/101 WordPress疑难问题以及解决方案汇总: 最近这 ...

  5. pip 查看软件包 可用版本并安装; pip 查看 numpy 可用版本并安装

    最近需要安装 numpy 的旧版本,发现不知道如何查看可以安装旧版本,解决方法在此进行记录: 然后找到你对应的版本进行安装就可以了: 保持更新,更多精彩内容,请关注 cnblogs.com/xuyao ...

  6. misc-3-1

    无后缀,用winhex发现是rar,添加后缀解压,依据是无后缀,丢到kali,是一个流量数据包 TCP追踪流在第五个数据包发现flag.rar 导出对象 选择HTTP 找到flag.rar 然后丢到你 ...

  7. BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路

    问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...

  8. 注意设置httpclient连接数

    在使用Httpclient的过程中,当访问量增大的时候,会发现本地的连接等待时间急剧增加,例如从400ms增加到 78000ms,之前一直以为是航信系统问题,后面经过检查才发现,原来是本地httpcl ...

  9. C++教程详解

    第一篇:基础篇 简介.环境配置.基本语法.注释.数据类型.变量类型.变量作用域.常量.修饰符类型. 存储类.运算符.循环.判断.函数.数字.数组.字符串.指针.引用.日期&时间. 基本的输入输 ...

  10. AtCoder Grand Contest 040

    Preface 今年准备省选啥都不说了,省选题基本上都做过一遍了,开始尝试板刷AGC 这场做完就从AGC001开始吧,感觉以我的速度和来机房的频率一个礼拜做一场都谢天谢地了 A - >< ...