OO模式-Singleton

讨论一:

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

1)先来说说全局变量的好处,当定义一个全局变量时,任何一个函数或者一行代码都可以轻松访问所有的全局变量,并且不用付出额外的代价,轻松简便。就如在敲机房收费的时候,我就定义机房登陆用户名为一个全局变量,因为在整个系统的执行过程中,很多方面都用到了用户名的信息,在此,调用全局变量,轻而易举就解决,很是方便。但是如果换成一个大型软件,又或者你的整个系统中定义了很多全局变量,这个时候使用起来就会比较混乱,使原本简单的事情变得复杂化了。

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)双重检查枷锁()

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

时间: 2024-09-30 16:05:08

OO模式-Singleton的相关文章

设计模式 - 单件模式(singleton pattern) 详解

单件模式(singleton pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349 单件模式(singleton pattern) : 确保一个类只有一个实例, 并提供一个全局访问点. 单价模式包括3个部分: 私有构造器, 静态变量, 静态方法. 具体方法: 1. 标准的单例模式: /** * @time 2014.6.5 */ package singleton; /** * @author

Design Patterns 乌蒙山连着山外山---单件模式singleton pattern

1 //包含单件实例的类Singleton 2 public class Singleton 3 { 4 //声明用于存储单件实例的变量instance 5 private static Singleton instance; 6 //定义用于标识同步线程的对象locker 7 private static Object locker = new Object(); 8 //私有的构造函数Singleton 9 private Singleton() { } 10 //公共访问的返回单件实例的函

说说设计模式~单件模式(Singleton)

单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 1 public sealed class Singlton 2 { 3 static Singlton instance = null; 4 private Singlton() { } 6 7 public static Singlton Instance 8 { 9 get 10 { 11 if (instance == null) 12 { 13 insta

单件模式(Singleton创建型)c#简单例子

单件(Singleton创建型模式)c#简单例子 需要生成一个实例时,可采用单件模式 例子中只可生成一个玩家,并对玩家进行测试.单线程例子如下: namespace singletonpattern { public partial class SingletonForm : Form { public SingletonForm() { InitializeComponent(); } private void btnDisplay_Click(object sender, EventArgs

单利模式-singleton

1.    什么是单利模式? 一个类有且仅有一个实例,并且自行实例化向整个系统提供. 2.   特点 a.  一个类只有一个实例 b.  必须自行创建该实例 c.  必须自行想整个系统提供该实例 d.  不能被继承 3.   单利模式的作用? 保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源. 4.   单利模式实现方式? a. 饿汉式 public class Singleton { private static EagerSingleton inst

[MyBean-说明书]关于插件的单件模式(singleton),插件的共享模式

[说明] 单件模式是一种用于确保整个应用程序中只有一个类实例. 想想我们的系统中有哪些方面可以应用到单件模式,比如大家常说的连接(ADOConnection)共享,其实就是指的单件模式. [MyBean中的单件模式] MyBean中插件一旦成为单件模式,框架就会帮你接管对象的生命周期.你每次调用getBean都只会产生一份实例,也就是说对象只会创建一次,不管是窗体插件还是无UI的逻辑插件. MyBean中可以通过两种方式使插件成为单件模式. 1.最简单的一种是注册的时候,参数选定为单件模式,也是

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

SINGLETON(单件)—对象创建型模式 几乎所有面向对象的程序中,总有一些类的对象需要是唯一的,例如,通过数据库句柄到数据库的连接是独占的.您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销.再如大家最经常用的IM,如QQ,在同一台电脑,一个帐号只能有唯一的登录. 1. 问题 怎样确保一个特殊类的实例是独一无二的(它是这个类的唯一实例),并且这个实例易于被访问呢? 2. 解决方案 1)全局变量:一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象.因为你的

JAVA--单例模式(Singleton)--设计模式三

1,单例模式的概述: (1)单例对象是一种常用的设计模式,在java应用中,单例对象能保证在一个 JVM中,该对象只有一个实例存在,这样的模式有几个好处: ①某些类创建比较频繁,对于一些大型的对象,这是一笔很大的开销 ②省去了new操作符,降低了系统内存的使用频率,减轻GC压力 ③有些类如交易所的核心交易系统,控制着交易流程,如果该类可以创建 多个的话,系统完全乱了,(比如一个军队出现了多个司令员同时指挥,肯定会乱成 一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程. (2)

第5章分布式系统模式 Singleton

上下文 在某些情况下,特定类型的数据需要提供给应用程序中的其他所有对象使用.在大多数情况下,这种类型的数据在系统中还是唯一的.例如,用户界面只能有一个所有应用程序必须访问的鼠标指针.同样,企业解决方案可能用单网关对象作为接口来管理与特定旧系统的连接. 影响因素 以下因素影响这种情况中的系统,在考虑上述问题的解决方案时必须协调这些影响因素: 很多编程语言(例如 Microsoft Visual Basic® 6.0 版或 C++)都支持全局对象的定义.这些对象位于命名空间的根部,应用程序中所有对象