讨论一:

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

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. strtok的基本使用方法

    理论知识自己能够百度这里直接上代码 代码的内容是 HDU(杭电)-1106-排序 排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 655 ...

  2. ubuntu eclipse&JDK

    1. 下载jre,eclipse,cdt 其中jre是java运行环境,eclipse需要先装jre,才可能运行,cdt是在eclipse中运行c\c++程序的插件. 1.1 下载jre 网址是:ja ...

  3. Ubuntu下允许Root用户的操作 (图形界面登录、su切换……)

    Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许“su”到 root.虽然这样的设置使安全性更高一些,但对于开发者来 说就显得很不方便了.如何让Ubuntu允许root用户直接登 ...

  4. 关于Unity中物理检测的准备

    1.要确定每个物体的碰撞类型,是有碰撞效果的碰撞还是没有碰撞效果的碰撞(is trigger),带不带刚体. 2.给每个物体分层,再设置哪些层会发生碰撞,哪些完全不产生碰撞. 3.给每个物体设置标记, ...

  5. Apple iOS MDM service 简介

    Apple iOS MDM service 簡介 藉由MDM服務,企業可以用來控管配發給員工的iOS Device.可以採用Apple官方推出的工具,也可以採用第三方開發的服務. MDM server ...

  6. qualcomm sdm450 tinymix mic record

    最近需要使用tinymix配置主MIC和副MIC进行录音,一般副MIC都是拿来降噪用的.记录一下副MIC录音的方法. 没有找到高通的音频通路图,只能通过logcat,查看audio_route,然后找 ...

  7. 【吉比特】G-bits2018校园春季招聘技术类岗位笔试经验

    笔试公司:厦门吉比特网络技术股份有限公司 笔试岗位:游戏研发工程师 笔试时间:2018年3月30日19:00-20:30 笔试形式:牛客网在线做题 笔试回忆: 笔试总共时长1小时半,共52道题.其中选 ...

  8. 第三百二十二节,web爬虫,requests请求

    第三百二十二节,web爬虫,requests请求 requests请求,就是用yhthon的requests模块模拟浏览器请求,返回html源码 模拟浏览器请求有两种,一种是不需要用户登录或者验证的请 ...

  9. SpringMVC系列(四)使用 POJO 对象绑定请求参数值

    在实际开发中如果参数太多就不能使用@RequestParam去一个一个的映射了,需要定义一个实体参数对象(POJO)来映射请求参数.Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配 ...

  10. unity-------Light的各个参数使用

    网上看到一篇关于灯光的文章,描述的很详细,如下: Lights will bring personality and flavor to your game. You use lights to il ...