核心--在类的内部把构造器私有化,同时在内部产生对象,并通过类.静态方法(static)返回实例化对象的引用

 

设计模式是在大量的实践总结和理论化之后优选的代码结果,编程风格,以及解决问题的思考方式.设计模式就像是经典的棋谱,不同的棋局我们用不同的棋谱.

单态设计模式:采取一定的方法保证在整个软件系统中,对某个类只能产生一个对象实例,并且该类只提供一个取得其对象的实例方法.

在java中实现单态模式只需要执行以下三步:  

  1.将类的构造方法的访问权限声明为private.这样就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象.

  2.在类内部生成一个静态的实例.

  3.提供一个静态的方法用于外部取得该类的实例.

  因为在类的外部无法得到类的对象,所以只能调用该类的某个静态方法以返回类内部创建的对象,又因为静态方法只能访问类中的静态成员变量,所以,指向类内部产生该类对象的变量也必须定义成静态的.

 

 

 

class Chinese{

    static Chinese objRef = new Chinese();

   

    private Chinese(){}

    public static Chinese getInstance(){

        return objRef;

    }

}

class Chinese_opt{

    static Chinese_opt objRef = null;

    private Chinese_opt(){}

    public static Chinese_opt getInstance(){

        if(objRef == null)

            objRef = new Chinese_opt();

        return objRef;

    }

   

}

class TestChinese{

    public static void main(String[] args){

        Chinese chinese1 = Chinese.getInstance();

        Chinese chinese2 = Chinese.getInstance();

        System.out.println(chinese1 == chinese2);

    }

}

 

 

 

 

 

1:构造方法私有化:

面向对象编程的三大特性:封装、继承、多态。类的封装性不仅体现在对属性的封装上,实际上方法也是可以被封装的,构造方法是特殊的方法当然也可以被封装,例如下面的代码就是对构造方法的封装:

package com.zxf.javaopp;

public class Singleton {

private Singleton(){     // 将构造方法进行了封装,私有化

}

public void print(){

System.out.println("Hello World!!!") ;

}

}

构造函数被私有化,不能在外部实例化,就无法在外部使用,此时只能在该类的内部实例化对象了,然后将该类拿到外部进行使用,由于该类不能再外部实例化,此时在内部的实例化必须是用static关键字修饰的:代码如下:

package com.zxf.javaopp;

class Singleton1{

static Singleton1 instance = new Singleton1() ;  // 在内部产生本类的实例化对象

private Singleton1(){       // 将构造方法进行了封装,私有化

}

public void print(){

System.out.println("Hello World!!!") ;

}

}

public class SingletonDemo01{

public static void main(String args[]){

Singleton1 s1 = null ;   // 声明对象

s1 = Singleton1.instance ;  // 取得实例化对象

s1.print() ;      // 调用方法

}

}

虽然上面的代码实现了功能,但又有些问题:通常情况下:我们将属性封装,此时的代码就要修改如下:

package com.zxf.javaopp;

class Singleton1{

static Singleton1 instance = new Singleton1() ;  // 在内部产生本类的实例化对象

public static Singleton1 getInstance(){       // 通过静态方法取得instance对象

return instance ;

}

private Singleton1(){       // 将构造方法进行了封装,私有化

}

public void print(){

System.out.println("Hello World!!!") ;

}

}

public class SingletonDemo01{

public static void main(String args[]){

Singleton1 s1 = null ;   // 声明对象

s1 = Singleton1.getInstance() ; // 取得实例化对象

s1.print() ;      // 调用方法

}

}

以上的代码似乎变得很复杂,不如不将构造方法实例化呢,但是为什么又会这样做呢?

假如我们现在要产生几个对象:按以往的代码,就需要实例化多次,每个对象都有其对应的堆栈空间,此时的内存就消耗的很多,系统的效率坑定比较低,但是使用将构造方法封装的模式效率就比较高:

使用将构造方法封装的方法:无论产生多少个对象,我们只实例化一次,这样的设计在设计模式上称为单态设计模式(单例设计模式):

singleton,如果不希望一个类产生多个实例的话,则必须使用单态设计模式,此设计模式,在以后的高性能开发中经常使用,而且在java的类库中大量的使用了此设计模式。

所谓单态就是在入口处限制了对象的实例操作。

单态设计模式的意义:

实际上这种模式非常常用,我们大家使用的windows操作系统中就使用了此设计模式,windows中用一个回车站: ,除了桌面以外,其他的每个硬盘中都有一个回车站,其他的回车站和其他硬盘的每个回车站都是同一个,也就是所整个操作系统中有且只有一个回车站,各个地方只是引用此实例。

总结:

单态设计模式的核心就是将类的

构造函数私有化,在类的内部产生实例对象,并通过类的静态方法返回类的实例对象。

JAVA单态设计模式的更多相关文章

  1. Java中单态设计模式

    Java中单态设计模式 2011-09-23 16:38:46|  分类: Java |  标签:technology!  |举报|字号 订阅     此博文是转自新浪博客中一名叫做"俊俊的 ...

  2. 基于java的设计模式入门(1)——为什么要学习设计模式

    大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...

  3. php 单态设计模式

    单态设计模式通常包含以下三点: · 一个私有的 构造方法:(确保用户无法通过创建对象对其进行实例化) · 一个公有的 静态的 方法:(负责对其本身进行实例化) · 一个私有的 静态的 属性:(用于保存 ...

  4. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  5. PHP 单态设计模式复习

    单态设计模式,也可以叫做单例设计模式, 就是一个类只能让它生成一个对象,避免重复的NEW,影响运行效率(每NEW一个对象都会在内存中开辟一块空间) 示例代码 <?php /* * 单态设计模式 ...

  6. 单例模式——Java EE设计模式解析与应用

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  7. Java IO设计模式(装饰模式与适配器模式)

    01. 装饰模式 1. 定义 Decorator装饰器,就是动态地给一个对象添加一些额外的职责,动态扩展,和下面继承(静态扩展)的比较.因此,装饰器模式具有如下的特征: 它必须持有一个被装饰的对象(作 ...

  8. java多线程设计模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt220 java多线程设计模式 java语言已经内置了多线程支持,所有实现Ru ...

  9. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

随机推荐

  1. 一、PHP基础-安装PHP集成环境

    目录 PHP运行集成环境下载 phpStudy集成环境安装 XAMPP集成环境安装 WampServer环境安装 作者:吴耀田  个人博客:http://www.cnblogs.com/isaacwy ...

  2. Docker开篇之HelloWorld

    按照程序世界的惯例,我们应该以HelloWorld的程序为起点开始介绍.那么接下来我们就看看Docker的HelloWorld是如何运行的. 安装 Docker CE 由于我的系统是OSX,个人推荐使 ...

  3. (数据科学学习手札40)tensorflow实现LSTM时间序列预测

    一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...

  4. TCP/IP协议族、版本以及编址机制

    TCP/IP协议族简称TCP/IP.这么命名是因为该协议家族中的两个核心协议:TCP(传输控制协议)和IP(网际协议),为该家族中最早通过的标准.TCP/IP提供点对点的链接机制,将数据应该如何封装, ...

  5. 北京Uber优步司机奖励政策(4月5日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. 【转载】四元数-Quaterion

    原文:四元数-Quaterion 四元数(Quaterion)   罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议   ...

  7. clr via c#读书笔记四:call、callvirt

    1.嵌套类,就是定义在类中的类:嵌套类可以访问外部类的方法.属性.字段而不管访问修饰符的限制,但是外部类只能够访问修饰符为public.internal的嵌套类的字段.方法.属性: 2.CLR如何调用 ...

  8. tensorflow学习一

    1.用图(graph)来表示计算任务 2.用op(opreation)来表示图中的计算节点,图有默认的计算节点,构建图的过程就是在其基础上加节点. 3.用tensor表示每个op的输入输出数据,可以使 ...

  9. php单例模式和工厂模式

    单例模式:防止重复实例化,避免大量的new操作,减少消耗系统和内存的资源,使得有且仅有一个实例对象 header("Content-type: text/html; charset=utf- ...

  10. 用libevent实现的echo服务器及telnet客户端

    以下代码在vs 2010编译通过,使用的libevent版本是:libevent-2.0.22,win7环境测试通过. 服务器实现: 1 流程图: 2 代码: // my_telnet.cpp : D ...