1.单例设计Singleton的引出

单例设计,从名字上首先可以看出单---即只有一个,例---只的是实例化对象;那么单例也就是说一个类,只产生了一个实例化对象。但是我们都知道,一个类要产生实例化对象很容易,只需要通过new关键字,new出来就可以了,怎么可能一个类只产生一个实例化对象呢,其实试想想,实例化对象的产生有一条必经之路,那就是构造方法。

什么是构造方法,构造方法是类进行实例化对象的必经之路,只有通过构造方法,才能为类的成员进行初始化,并开辟相应的堆空间进行存储。那么接着上面的来说,一个类要只产生一个实例化对象,那就必须控制这个构造方法,如何做?  如果我们将这个构造方法用private关键字修饰起来,也就说构造方法私有化,那么在这个类的外部就无法来new出实例化对象了,那就产生了一个类只有一个实例化对象了。具体代码如何实现呢,看下面代码:

 package com.huawei.madejin.demo;

 class Singleton
{
private Singleton INSTANCE = new Singleton(); //产生了一个私有化的实例对象
private Singleton(){} //构造方法进行了私有化 public void print()
{
System.out.println("Hello World");
} }
public class SingletonTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub } }

上面可以看出,产生了一个私有化的实例化对象,但在外部如何去访问这个,或者说获得这个对象呢,显然,如果用普通的方法或者属性,是不行的,因为对于普通方法而言,需要通过实例化对象点方法的形式去访问,但外部是没有这个实例化对象的,那么怎么办?这个时候,就应该想到static的方法,是属于类的方法,不需要实例化对象的时候也可以访问的,即在类中加上static的方法,类中加上static方法之后,静态的方法只能访问静态的属性而不能去访问非静态的属性,所以private Singleton INSTANCE = new Singleton();也应该加上static;既然static已经加上了,那么为了使其更加完整,只有一个实例对象,并且不允许在其内部发生改变,则加上final;就更加完美了,于是形成了单例设计的完整模式。如下所示:

 package com.huawei.madejin.demo;

 class Singleton
{
private final static Singleton INSTANCE = new Singleton();
private Singleton(){} public static Singleton getInstance()
{
return INSTANCE;
} public void print()
{
System.out.println("Hello World");
} }
public class SingletonTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton s = Singleton.getInstance();
s.print();
} }

然后,在上述单例设计模式的基础上,我们在想想,上述的INSTANCE这个实例化对象,无论你在SingletonTest类中用不用,这个实例化对象都存在,那么如果我需要节省一下空间,让其用的时候,我在产生不是更好,于是产生了改进:

 package com.huawei.madejin.demo;

 class Singleton
{
//private final static Singleton INSTANCE = new Singleton();
private static Singleton INSTANCE = null;
private Singleton(){} public static Singleton getInstance()
{
if(INSTANCE == null)
{
INSTANCE = new Singleton();;
}
return INSTANCE;
} public void print()
{
System.out.println("Hello World");
} }
public class SingletonTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Singleton s = Singleton.getInstance();
s.print();
} }

这样就产生了单例设计模式的两种形式:一种就是第一种,称为恶汉方式的单例设计模式,第二种被称为懒汉方式的设计模式。实际开发中,根据情况都可以使用,其实质差不多。

发散思维:

 package com.huawei.madejin.demo;

 class Color
{
private String title; private final static Color RED = new Color("red");
private final static Color BLUE = new Color("blue");
private final static Color GREEN = new Color("green"); public static Color getColor(int i)
{
switch(i)
{
default:
case 0 :
return RED;
case 1:
return BLUE;
case 2:
return GREEN;
}
}
private Color(String title){
this.title = title;
} public String toString(){
return this.title;
}
} public class MultitonTest { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Color c= Color.getColor(1);
System.out.println(c.toString());
} }

上述这段代码,为多例设计模式,因为不常用,这里就不讲了.......;(~ o ~)~zZ,准备吃饭了。。。。。

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

  1. java设计模式——单例(Singleton)模式

    在某些场景,你需要找到一个承担职责的对象,并且这个对象是他所属类的唯一实例.此时可以使用单例模式. 单例模式的意图是为了确保一个类有且仅有一个实例,并为他提供一个全局的访问点.创建一个担当独一无二角色 ...

  2. java设计模式--单例

    GOF23(group of four)---由4个大牛总结的JAVA23种常用的设计模式,归根结底都是为了代码的可扩展性. 设计模式中一种比较重要的思想就是:开闭原则,尽量做到对扩展开放,对修改关闭 ...

  3. Java设计模式—单例设计模式(Singleton Pattern)全然解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

  4. java设计模式——单例设计模式

    /*设计模式:对问题行之有效的解决方式.其实它是一种思想. 1,单例设计模式.    解决的问题:就是可以保证一个类在内存中的对象唯一性. 必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的 ...

  5. java设计模式-单例(singleton)

    单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例 如何保证对象唯一性呢? 思想: ...

  6. java设计模式-----单例设计模式

    设计模式是个很高深的东西,我也是略懂皮毛,下面让我用最简洁易懂的语言描述下单例设计模式吧. 一些人总结出来用来解决特定问题的固定的解决方案. 解决一个类在内存中只存在一个对象,想要保证对象的唯一. 1 ...

  7. 算法、数据结构、与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design)

    算法.数据结构.与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design) 作者: Compasslg 李涵威 1. 什么是单例设计(Singleton Design) 在学 ...

  8. java的单例设计模式

    java的单例设计模式包括:饿汉设计模式和懒汉设计模式: 步骤: 1.创建一个对象把他设置为私有的成员变量,保证唯一 2.私有构造方法,防止new一个对象. 3.定义一个公开的静态方法,返回第一步创建 ...

  9. 【Java】单例设计模式

    文章目录 单例设计模式 什么是设计模式 单例设计模式 实现 饿汉式 懒汉式 饿汉式与懒汉式的区别 饿汉式 懒汉式 单例模式的应用场景 单例设计模式 什么是设计模式 设计模式是在大量的实践中总结和理论化 ...

随机推荐

  1. Maven的安装环境配置

    一.Maven的安装 二.Maven的配置 Settings.xml可以用来定义本地仓库.远程仓库.联网代理 Settings.xml文件可以存在两个地方: 1.多用户情况 conf目录下 2.单用户 ...

  2. 获取url参数和时间格式化

    1. 获取url参数: var url = request("url"); //获取url参数 function request(paras) { //decodeURI() 函数 ...

  3. vs2015编译mysql c++ connector

    目前MySQL Connector/C++的binary版本最高只支持VS2008,VS2015需要下载源码自行编译. 1.CMAKE 到官网下载最新的稳定版本 把bin目录添加到环境变量PATH中 ...

  4. 主流IOC框架测验(.NET)

    上一篇中,我简单介绍了下Autofac的使用,有人希望能有个性能上的测试,考虑到有那么多的IOC框架,而主流的有:Castle Windsor.微软企业库中的Unity.Spring.NET.Stru ...

  5. java域名解析

    DNS原理:http://amon.org/dns-introduction.html 根域:就是所谓的“.” 根域服务器只是具有13个IP地址,但机器数量却不是13台,因为这些IP地址借助了任播的技 ...

  6. yum命令被锁 Existing lock /var/run/yum.pid

    有时使用yum命令,不知怎会回事就提示: Existing lock /var/run/yum.pid: another copy is running as... 感觉也没操作什么错误的事情. 此时 ...

  7. [转python 父类可以调用子类的方法

    问题描述:我也是在读500 Line 里满的DBDB 的代码时发现的,python的父类可以调用子类的方法,这跟平常习惯的理解方式很不一样,所以就查了下原因,记录如下:   1.现象:最近使用到了So ...

  8. CentOS6+MySQL5.6二进制安装

    一般我们安装mysql采用二进制安装的方式就足以满足我们的生产环境了,不过需要我们配置my.cnf文件 从官网下载二进制MySQL,选择Linux-Generic,最后这两个是二进制包 http:// ...

  9. RMAN中FILESPERSET设置对备份速度的影响

    看到网上部分人说不指定FILESPERSET(默认值=64)则会导致分配的通道只走第一个而导致备份效率低下,今天仔细研究了一下,参照了多个博主文章,得出结论如下: 如果没有指定filesperset, ...

  10. 扩展BaseAdapter实现不存储列表项的ListView

    下面的实例将会通过扩展BaseAdapter来实现Adapter,扩展BaseAdapter可以取得对Adapter最大的控制权:程序要创建多个列表项,每个列表项的组件都由开发者来决定. 下面的布局文 ...