java 构造方法私有化及单态模式

构造方法私有化及单态模式

构造方法封装

类的封装性不光体现在对属性的封装上,实际上方法也是可以被封装的,当然在方法封装中也包含了对构造方法的封装。例如:以下的代码,就是对构造方法进行了封装。

[java] view
plain
copyprint?

  1. class Singleton{
  2. private Singleton(){  // 将构造方法进行了封装,私有化
  3. }
  4. public void print(){
  5. System.out.println("Hello World!!!") ;
  6. }
  7. };
  8. public class SingletonDemo02{
  9. public static void main(String args[]){
  10. Singleton s1 = null ; // 声明对象
  11. s1 = new Singleton() ; // 错误,无法实例化对象
  12. }
  13. };

此时,被私有化构造方法的Singleton类,不能在外部直接私有化,既然在外部不可以使用,那么如果在内部呢?

[java] view
plain
copyprint?

  1. class Singleton{
  2. Singleton instance = new Singleton() ; // 在内部产生本类的实例化对象
  3. private Singleton(){  // 将构造方法进行了封装,私有化
  4. }
  5. public void print(){
  6. System.out.println("Hello World!!!") ;
  7. }
  8. };
  9. public class SingletonDemo03{
  10. public static void main(String args[]){
  11. Singleton s1 = null ; // 声明对象
  12. }
  13. };

一个类的构造方法私有化之后,则只能从其类的内部取得实例化对象,那么此时要考虑的问题就是如何把内部生成的instance对象拿到外部类,这样外部就可以直接通过对象进行实例化。

正常情况下,instance属性只能通过Singleton类的实例化对象才可以进行调用,如果在没有实例化对象的时候依然可以取得instance,则就需要将instance声明成static访问类型,因为使用static声明的变量,可以直接使用类名称进行访问。

[java] view
plain
copyprint?

  1. class Singleton{
  2. static Singleton instance = new Singleton() ; // 在内部产生本类的实例化对象
  3. private Singleton(){  // 将构造方法进行了封装,私有化
  4. }
  5. public void print(){
  6. System.out.println("Hello World!!!") ;
  7. }
  8. };
  9. public class SingletonDemo04{
  10. public static void main(String args[]){
  11. Singleton s1 = null ; // 声明对象
  12. s1 = Singleton.instance ; // 取得实例化对象
  13. s1.print() ;  // 调用方法
  14. }
  15. };

正常情况下这些属性应该封装才对,所以以上的代码最好修改为以下的形式:

[java] view
plain
copyprint?

  1. class Singleton{
  2. private static Singleton instance = new Singleton() ; // 在内部产生本类的实例化对象
  3. public static Singleton getInstance(){  // 通过静态方法取得instance对象
  4. return instance ;
  5. }
  6. private Singleton(){  // 将构造方法进行了封装,私有化
  7. }
  8. public void print(){
  9. System.out.println("Hello World!!!") ;
  10. }
  11. };
  12. public class SingletonDemo05{
  13. public static void main(String args[]){
  14. Singleton s1 = null ; // 声明对象
  15. s1 = Singleton.getInstance() ; // 取得实例化对象
  16. s1.print() ;  // 调用方法
  17. }
  18. };

构造私有化之后,就可以通过以上的形式取得实例化对象。

程序的意义?

以上的代码不如直接实例化操作来的直接,为什么还要这样去做呢?

如果现在产生了本类的三个对象。

[java] view
plain
copyprint?

  1. class Singleton{
  2. private static Singleton instance = new Singleton() ; // 在内部产生本类的实例化对象
  3. public static Singleton getInstance(){  // 通过静态方法取得instance对象
  4. return instance ;
  5. }
  6. private Singleton(){  // 将构造方法进行了封装,私有化
  7. }
  8. public void print(){
  9. System.out.println("Hello World!!!") ;
  10. }
  11. };
  12. public class SingletonDemo05{
  13. public static void main(String args[]){
  14. Singleton s1 = null ; // 声明对象
  15. Singleton s2 = null ; // 声明对象
  16. Singleton s3 = null ; // 声明对象
  17. s1 = Singleton.getInstance() ; // 取得实例化对象
  18. s2 = Singleton.getInstance() ; // 取得实例化对象
  19. s3 = Singleton.getInstance() ; // 取得实例化对象
  20. s1.print() ;  // 调用方法
  21. s2.print() ;  // 调用方法
  22. s3.print() ;  // 调用方法
  23. }
  24. };

不管外部声明了多少个Singleton的对象,但是最终结果都是通过getInstance()方法取得的实例化对象,也就是说,此时S1、S2、S3实际上都使用了一个对象的引用:instance

那么这样的设计在设计模式上来讲,属于单态设计模式(单例设计模式):Singleton

如果现在不希望一个类产生过多的对象的话,则就必须使用单态设计模式,而且使用单态设计模式在以后的JAVA学习中会经常碰到,因为在JAVA的支持的类库中,大量的采用了此种设计模式。

所谓的单态就是在入口处(构造方法)限制了对象的实例化操作。

单态设计模式的意义

实际上这样的应用,读者应该早就能有所了解了,读者应该都会很清楚在windows中有一个回收站的程序,除了桌面上的回收站之外,每个硬盘上都有一个回收站,实际上每个硬盘的回收站和桌面上的回收站都是同一个,那么也就是说在整个操作系统上只有一个回收站实例,各个地方只是引用此实例而已。

总结:

单例模式步骤:

1.将类中的构造方法私有化。

2.在内部通过静态私有化属性实例化对象。

3.创建公共函数返回静态私有化属性。

时间: 2024-08-10 15:10:19

java 构造方法私有化及单态模式的相关文章

Java单态模式(Singleton模式)

定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有,singleton能够被状态化:这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到. 另外方面,Singleton也能够

JAVA单态模式

该模式较常见也是使用最频繁的设计模式之一.单态模式的主要作用是保证在JAVA应用程序中某些特定的类只有一个实例存在. 该模式的好处: 节省内存及系统开销,使用合适的中间件(.NET Remoting),可以把SINGLETON模式扩展为跨多个CLR或多个计算机工作.任何类都可以方便的转换为SINGLETON模式.只在第一次使用时进行创建.并且它由于限制了实例个数,有利于垃圾回收. 缺点:不能继承.效率问题.调用不透明(调用者知道自己在调用谁) 示例: 常用于数据库访问.单点登录等.下面的代码演示

【小白的java成长系列】——构造方法私有化(单例设计)

有了解过spring框架的童鞋们就知道,spring的bean默认是什么形式呀?---单例形式的. 问:那什么叫做单例?单例其实就是Singleton,顾名思义就是只有单个的实例对象操作. 那为什么要使用单例呢? 至于这个问题,后面再做解释,我们先看代码: package me.javen.oop; public class SingletonDemo { public static void main(String[] args) { Singleton singleton1 = Single

java中单态模式或单例模式(Singleton)有什么意义?

8.单态模式或单例模式(Singleton) (视频下载) (全部书籍)单态模式有什么用呢?想一下Adobe Photoshop ,处理两张图,会启动两个photoshop吗?多耗费内存呀! ( Consider Adobe or oracle, process two images with two adobes?),所以单态模式在公司编程是非常重要的.有很多场合都要求,对象只能存在一个,多了的话就太耗费资源.(马克-to-win) class Photoshop {/* 通过调试发现写成 s

构造方法私有化和单例模式

一,构造方法私有化: 即对构造方法加上private关键词. 如: class Singleton{ private Singleton(){ // 将构造方法进行了封装,私有化 } }; 但是由于私有化的方法和属性只能在本类中看到和访问,其他方法中是看不到的! 所以对于以下做法. class Singleton{ private Singleton(){ // 将构造方法进行了封装,私有化 } public void print(){ System.out.println("Hello Wor

《Java设计模式》之原型模式

原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意. 原型模式的结构 原型模式要求对象实现一个可以"克隆"自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例.这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建. 原型模式有两种表现形式:(1)简单形式.(2)登记形式,这两

Spring 实现两种设计模式:工厂模式和单态模式

在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工厂模式可将Java 对象的调用者从被调用者的实现逻辑中分离出来,调用者只需关心被调用者必须满足的规则(接口) ,而不必关心实例的具体实现过程.这是面向接口编程的优势,能提高程序的解耦,避免所有的类以硬编码方式耦合在一起. 如果所有的类直接耦合,极易形成"骨牌效应",假如B 类调用了A 类,一旦A 类需要修改,则B 类也需要修改:假如C 类调用了B 类,则C 类也需要修改......依次类推,从而导致整个系统都需要改写

JAVA基础——设计模式之单列模式

一:单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 单例设计模式的特点: 单例类只能有一个实例 单例必须创建对象 单例类需要对外提供该对象 核心知识点如下: 将采用单例设计模式的类的构造方法私有化(采用private修饰). 在其内部产生该类的实例化对象,并将其封装成private static类型. 定义一个静态方法返回该类的实例. 二:单例式的分类 1.饿汉模式: 优点是: 写

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?