讨论一:

既然仅仅有一个类?为什么非要用一个模式来定义?难道就不能用程序猿之间的约定又或者使用伟大的设计模式来完毕?

1)先来说说全局变量的优点,当定义一个全局变量时,不论什么一个函数或者一行代码都能够轻松訪问全部的全局变量,而且不用付出额外的代价,轻松简便。

就如在敲机房收费的时候,我就定义机房登陆username为一个全局变量,由于在整个系统的运行过程中,非常多方面都用到了username的信息。在此。调用全局变量。轻而易举就解决,非常是方便。可是假设换成一个大型软件,又或者你的整个系统中定义了非常多全局变量,这个时候使用起来就会比較混乱,使原本简单的事情变得复杂化了。

2)对于变量名的设定我认为也是一个难题,假设过多的话真的会导致变量名的冲突,到时候无疑又给自己添加了一个难题。

3)当然最重要的一点,定义全局变量,无疑添加了模块与函数之间的耦合度。也就是说你已经把他们牢牢的拴在了一起,想要再又一次改动,可就变得不是那么简单了。

来看看类图:

getInstance()方法是静态的,这意味着它是一个类方法,所以能够在代码的不论什么地方使用,事实上这和全局变量使用起来是一样的,只是单件能够延迟实例化。

讨论二:

单例模式的使用之处:

有一些对象我们仅仅使用一个。如threadpool。Cache。对话框,注冊表对象,日志对象。充当打印机、显卡等设备的驱动程序的对象。

讨论三:简单而又不简单

简单之意:由于它仅仅涉及到了一个类,所以终于“祸害”了大家,事实上他是非常调皮的!只是调皮归调皮,却还是蛮厉害的。

事实上自己对于Chocolate还是蛮钟情的。假设自己可以开一个制造巧克力的工厂多好。这样既能用到自己所学的知识,还能满足自己的小胃口。只是这样的甜食依然还是少吃为好吧!

假如我们这有一个锅炉正在工作,而不知情的工作者又打开了一个锅炉。本来一个锅炉的原料就已经足够,再加一个。可想而知。会有多少浪费……

这时候我们就能够使用"Singleton"来帮你解决这个问题:

避免不知情的情况下再次打开一个锅炉。也就是把锅炉设计单件:

//巧克力制作一个单一的过程
public class ChocolateBoiler {
private boolean empty; //定义私有变量
private boolean boiled;
//uniqueInstance持有唯一的单件实例
private static ChocolateBoiler uniqueInstance; private ChocolateBoiler(){
//開始时。锅炉是空的
empty=true;
boiled=true;
}
public static ChocolateBoiler getInstance()
{
if (uniqueInstance==null){
//System.out.println("Creating unique Instance of Chocolate Boiler");
uniqueInstance = new ChocolateBoiler();
}
return uniqueInstance;
} public void fill() <span style="font-family: 华文新魏; font-size: 16pt; text-indent: 21pt;">{</span>
  if (isEmpty()) {
empty = false;
boiled = false;
//填充混合物
}
}

但是运行完之后会发现。自己同意在加热的过程中继续增加原料,这但是会溢出的啊。我们唯一想到的原因就是刚刚使用的多线程对ChocolateBoiler进行了优化,来建立一个ChocolateCotroller来控制一下吧!

public class ChocolateController
{
public static void main(String args [])
{
ChocolateBoiler boiler = ChocolateBoiler.getInstance();
boiler.fill(); //填充
boiler.boil();<span style="white-space:pre"> </span> //煮沸方法
boiler.drain(); //排除煮沸的填充物的方法 // will return the existing instance
ChocolateBoiler boiler2= ChocolateBoiler.getInstance();
}

假设boiler在工作。那么boiler2仅仅会听后指挥。

对于多线程的处理採用synchronized方法。也就是把getInstance()方法变成同步(synchronized)方法,多线程灾难轻而易举的就攻克了。

//多线程处理
public static synchronized ChocolateBoiler getInstance()
{
if (uniqueInstance==null){
uniqueInstance = new ChocolateBoiler();
}
return uniqueInstance;
}

假设想在不改变运行效率的情况下。急切的创建实例,能够在一个静态初始化器创建单件,

Public class Singleton ChocolateBoiler
{
//在static initializer中创建单件,保证了线程安全
Private static ChocolateBoiler uniqueInstance = new ChocolateBoiler(); Private ChocolateBoiler() {} Public static ChocolateBoiler getInstance()
{
Return uniqueInstance; //直接使用
}
}

对于Singleton也仅仅是懂得了一个皮毛而已。非常期待在机房合作的时候实践一番!唠叨了半天,事实上就是三种对于巧克力锅炉代码多遇到的问题:

1)同步getInstance方法,保证可行的最直接的方法

2)急切实例化

3)双重检查枷锁()

三种方法是一个层层优化的过程,只是优化也要针对问题,对症下药才可。

OO模式-Singleton的更多相关文章

  1. 单件模式Singleton来控制窗体被重复或多次打开

    本文转载:http://blog.csdn.net/a0700746/article/details/4473796 一般在百度搜一下,会出来一下内容,看来很好用.Singleton很方便的一个用处就 ...

  2. 8.2 GOF设计模式一: 单实例模式 SingleTon

    GOF设计模式一: 单实例模式 SingleTon  整个美国,只有一个“现任美国总统”  比如,在学校,“老师”,有数百个:“校长”,只有一个  系统运行时,如何保证某个类只允许实例化一个对象 ...

  3. 设计模式 - 单件模式(singleton pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...

  4. 单例/单体模式(Singleton)

    单例/单体模式(Singleton) 首先,单例模式是对象的创建模式之一,此外还包括工厂模式. 单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3, ...

  5. Java 单列模式(Singleton)

    单例模式(Singleton) 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 目的:使得类的一个对象成为系统中的唯一实例. 如何保证一个类只有一个实例并且这个实例易于被访问呢? 我们都 ...

  6. C#设计模式——单件模式(Singleton Pattern)

    一.概述在软件开发过程中,我们有时候需要保证一个类仅有一个实例,比如在一个电脑用户下只能运行一个outlook实例.这时就需要用到单件模式.二.单件模式单件模式保证一个类仅有一个实例,并提供一个访问它 ...

  7. 设计模式之单实例模式(Singleton)

    原理:将类的构造函数由pubic变为private或者protect,添加获取对象的public 成员函数,返回指向对象的静态指针. 首先来一段简单的代码实现 代码一 class Singleton ...

  8. 设计模式(二)单件模式Singleton(创建型)

    SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关 ...

  9. 懒人模式Singleton模式Meyers版本号

    直接看代码: /* Singleton模式保证:在一个程序,,一个类有且只有一个实例.并提供一个访问 它的全局访问点 在编程其中.很多情况下,需要确保有一类的一个实例 比如: windopws系统中仅 ...

随机推荐

  1. c# 自定义类型的DataBindings

    自定义类型TextBoxEx,扩展了TextBox,增加了一个属性KeyText来保存后台的值(Tag已另作它用). 程序里面需要将KeyText和DataTable的某个列绑定起来. 如果是Text ...

  2. 数据採集之Web端上传文件到Hadoop HDFS

    前言 近期在公司接到一个任务.是关于数据採集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志採集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好近期都有在这方面 ...

  3. 用图片做div背景的列表布局 CSS代码

    思路: 1.因为是竖型列表,所以外层用 相对定位,这样 在不会重叠在一起 relative 2.里面用绝对位置 absolute,覆盖在图片上面 3.这里有个小技巧,我里面有个特效,文字竖立,并向右旋 ...

  4. Redis键

    Redis的keys命令用于管理键.使用Redis的keys命令语法如下所示: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 例子 redis 127.0. ...

  5. SSM Spring +SpringMVC+Mybatis 整合配置 及pom.xml

    SSM Spring +SpringMVC+Mybatis 配置 及pom.xml SSM框架(spring+springMVC+Mybatis) pom.xml文件 maven下的ssm整合配置步骤

  6. Linux下 ln 命令详解

    这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件或目录在另外一个位置建立一个同步的链接,类似Windows下的超级链接. 这个命令最常用的参数是-s,具体用法是: sudo ...

  7. PHP开发安全问题总结

    php给了开发者极大的灵活性,但是这也为安全问题带来了潜在的隐患,近期需要总结一下以往的问题,在这里借翻译一篇文章同时加上自己开发的一些感触总结一下. 简介 当开发一个互联网服务的时候,必须时刻牢记安 ...

  8. office 2013 快速换KEY

    在有些时候,我们总会碰到一些需要更换Office安装Key(序列号.密钥)的情形,例如购买或朋友赠了新的Key等等.网上搜索的话,有很多种更改变换Office 2010序列号办法,今天就来挨个介绍一下 ...

  9. QTcpSocket 发送和接收数据的几种方法

    1.QTcpSocket 继承于QAbstractSocket继承于QIODevice 2.QTcpSocket 提供的几种接收和发送数据方法 write ( const char *, qint64 ...

  10. C语言中二维字符数组的定义和初始化

    本篇日志关于二维字符数组的定义和初始化.我相信这篇文章属于菜鸟级的,高手请直接无视. 一般来说,我们可能会希望定义一个二维字符数组并且在定义的时候就用一些字符串来初始化它.比如说: ][MAX_LEN ...