`
lovnet
  • 浏览: 6706585 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

设计模式观察-Singleton

阅读更多

本篇先讨论单件 Singleton,单件的目标是保证一个类型只有一个实例,那么由谁来保证实例的唯一性呢?可能的方案有:

a)调用端保证。
调用端调用一个类时,他是不需要也不会去考虑这个类是否已经被实例化的。而且把这样的监管工作交给调用端是很不负责的做法。
b)类型内部保证。

类型内部如何保证?

将实例创建工作放到类型内部,这样类型就可以将实例创建工作监管起来。类型可以知道内部的实例有没有被创建,甚至可以知道创建实例的工作被执行了多少次。

所以个人认为理解单件需要分为两步:

1、 监管工作谁来做?实例的监管工作需要类型自己去做。

2、 监管工作如何做?类型如何保证实例唯一就是技术实现问题了,可以看到的版本有 线程安全的、双重锁定的、延迟初始化的等。

下面使用伪代码逐步分析实例化工作放到类型内部的做法。

调用我,实例我给你

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->classSingleton
{
SingletonInstance
=null;
// 实例化类型Singleton
SingletonGetInstance()
{
Instance
=newSingleton();
returnInstance;
}

}

你只管调用,我保证唯一

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->classSingleton
{
SingletonInstance
=null;
//实例化类型Singleton
SingletonGetInstance()
{
Instance
=newSingleton();
returnInstance;
}
//实例化类型Singleton,实例化时判断类型有没有被创建过,这样就保证了实例的唯一
SingletonGetInstance()
{
if(Instance==null)
{
Instance
=newSingleton();
}
returnInstance;
}

}

你们都可以调用,我需要统计调用次数

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->classSingleton
{
SingletonInstance
=null;
publicintCount{get;set;}
//实例化类型Singleton
SingletonGetInstance()
{
Instance
=newSingleton();
returnInstance;
}
//实例化类型Singleton,实例化时判断类型有没有被创建过,这样就保证了实例的唯一
SingletonGetInstance()
{
if(Instance==null)
{
Instance
=newSingleton();
}
returnInstance;
}
//实例化类型Singleton,并且加入一个计数器,这样能知道实例化工作被执行了多少次
SingletonGetInstance()
{
Count
++;
if(Instance==null)
{
Instance
=newSingleton();
}
returnInstance;
}

}

想使用实例?请出示合法证件

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->classSingleton
{
SingletonInstance
=null;
publicintCount{get;set;}
//实例化类型Singleton
SingletonGetInstance()
{
Instance
=newSingleton();
returnInstance;
}
//实例化类型Singleton,实例化时判断类型有没有被创建过,这样就保证了实例的唯一
SingletonGetInstance()
{
if(Instance==null)
{
Instance
=newSingleton();
}
returnInstance;
}
//实例化类型Singleton,并且加入一个计数器,这样能知道实例化工作被执行了多少次
SingletonGetInstance()
{
Count
++;
if(Instance==null)
{
Instance
=newSingleton();
}
returnInstance;
}
//实例化类型Singleton,并且接收一个合法的授权,这样可以知道每个授权方的调用次数,使用频率
SingletonGetInstance(stringcaller)
{
//Check调用方合法性验证
if(Check(caller))
{
CallerCount(caller);
if(Instance==null)
{
Instance
=newSingleton();
}
returnInstance;
}
else
returnnull;
}
//记录调用方调用次数
publicvoidCallerCount(stringcaller)
{
//callerCount++
}
publicboolCheck(stringcaller)
{
returntrue;
}
}


欢迎一起讨论!

--------------------------补充-------------------------------

我把几种流行的 Singleton 写法发出来,省的大家再去查资料。

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->publicclassMySingleton
{
MySingletoninstance
=null;
MySingleton(){}
//简单写法
publicMySingletonIstance
{
get
{
if(instance==null)
{
instance
=newMySingleton();
}
returninstance;
}
}
//线程安全
staticreadonlyobjectobj=newobject();
publicMySingletonSafeInstance
{
get
{
lock(obj)
{
if(instance==null)
instance
=newMySingleton();
returninstance;
}
}
}
//双重锁定节约开销
publicMySingletonLockInstance
{
get
{
if(instance==null)
{
lock(obj)
{
if(instance==null)
instance
=newMySingleton();
}
}
returninstance;
}
}
//静态初始化
staticMySingleton(){}
staticreadonlyMySingletonstaticinstance=newMySingleton();
publicstaticMySingletonStaticInstance
{
get
{
returnstaticinstance;
}
}
//延迟初始化
publicstaticMySingletonlazyInstance
{
get
{
returnLazy.staticinstance;
}
}
classLazy
{
internalstaticreadonlyMySingletonstaticinstance=newMySingleton();
staticLazy(){}
}
}


分享到:
评论

相关推荐

    设计模式--C++

    1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...

    设计模式--可复用面向对象软件的基础

    1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...

    java版本二十三种设计模式.zip

    - 23种设计模式 - 工厂方法模式(Factory Method) - 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰...

    C#设计模式.PDF

    C#设计模式(7)-Singleton Pattern 50 一、 单例(Singleton)模式 50 二、 Singleton模式的结构: 51 三、 程序举例: 51 四、 在什么情形下使用单例模式: 52 五、 Singleton模式在实际系统中的实现 53 六、 C#...

    C#设计模式大全

    C#设计模式(7)-Singleton Pattern 一、 单例(Singleton)模式 二、 Singleton模式的结构: 三、 程序举例: 四、 在什么情形下使用单例模式: 五、 Singleton模式在实际系统中的实现 六、 C#中的Singleton...

    研磨设计模式-part2

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    JAVA设计模式-day2.pdf

    JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...

    研磨设计模式-part4

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part3

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    设计模式:可复用面向对象软件的基础--详细书签版

     “[设计模式]在实用环境下特别有用,因为它分类描述了一组设计良好,表达清楚的面向对象软件设计模式。整个设计模式领域还很新,本书的四位作者也许已占据了这个领域造诣最深的专家中的半数,因而他们定义模式的方法...

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) C#面向对象设计模式纵横谈(4):Builder 生成器模式(创建型模式) C#面向...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    23种Python设计模式示例演示源码包.rar

    23种Python设计模式示例演示源码包,比如包括了工厂模式、Bridge桥接模式、Builder构建模式、Facade外观模式、Adapter适配器模式,Composite组合模式、Decorator装饰器模式,FactoryMethod工厂方法模式、Flyweight享...

    23种设计模式的java源代码

    里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些代码对于初学者看起来稍微复杂一些,我...

    33种JAVA设计模式DEMO

    这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    java设计模式期末考试选择题100道

    适合Java设计模式期末考试选择题复习,形式如下: 10.(单选题)Facade(外观)模式的意图是 正确答案: A A.希望简化现有系统的使用方法,你需要定义自己的接口 B.将一个无法控制的现有对象与一个特定借口相匹配。 C....

    设计模式,软件开发者必读

    设计模式的个人总结教材,适合IT专业人士研究,目录如下: 序言 概念 6 1.1 设计模式的定义 6 1.2 设计模式的作用 6 1.3 设计模式的由来 6 1.4 设计模式的分类 7 1.5 OO设计七原则 7 1.5.1 开-闭原则(OPEN-CLOSED ...

    《设计模式》中文版(23个设计模式的介绍与运用)

    1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...

Global site tag (gtag.js) - Google Analytics