热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

软件工程设计模式学习之单例模式Singleton

技术交流,DH讲解.单例模式一般都是在全局变量区存放一个变量,然后在创建的时候先看这个全局变量是否被赋值了,如果没有就创建如果有就直接返回这个全局变量.UML图:要是不想被人创建对

技术交流,DH讲解.

单例模式一般都是在全局变量区存放一个变量,然后在创建的时候先看这个全局变量是否被赋值了,
如果没有就创建如果有就直接返回这个全局变量.
UML图:
singleton
要是不想被人创建对象的实例,那么一般的办法就是把构造方法设置成私有域.
好了,原理说了,我们就来看看代码怎么实现吧.

 

1 php
2  class PHPSinglton {
3 private $huangjacky;
4 private static $singleinstance;
5 private function __construct(){
6 $huangjacky='TheFiend';
7 }
8 static function GetInstance(){
9 if(!isset($singleinstance))
10 $singleinstance = new PHPSinglton();
11 return $singleinstance;
12 }
13 }
14  ?>

 

 

这个是PHP的单例模式的代码. 我们用一个静态变量来充当了全局变量.


接下来是C#的例子:

 

1 public class CSharpSingleton{
2 private static CSharpSingleton instance;
3 private CSharpSingleton(){
4 }
5 public static CSharpSingleton GetInstance(){
6 if (instance == null)
7 instance = new CSharpSingleton();
8 return instance;
9 }
10 }
11  private void button1_Click(object sender, EventArgs e)
12 {
13 CSharpSingleton a, b;
14 //a = new CSharpSingleton();这个会报错的
15   a = CSharpSingleton.GetInstance();
16 b = CSharpSingleton.GetInstance();
17 if (a==b)
18 { MessageBox.Show("Equals"); }
19 }
20  

 

 


现在PHP和C#的代码都有了.
我们该干什么了?嘿嘿,肯定是用我们喜欢的Delphi来实现一下:
由于Delphi里面如果我们将Constructor设置成private但是Delphi会悄悄的改回public
而且我们还发现不了...
有问题就要解决问题咯.看看
TSingleton = Class
Private
Class Var Instance: TSingleton;
Public
Class Function GetInstance: TSingleton;
Class Function NewInstance: TObject; Override;
Procedure FreeInstance; Override;
End;
我们会发现这里重载了TObject里面的2个方法.
Procedure TSingleton.FreeInstance;
Begin
Inherited;
Instance := Nil;
End;
Class Function TSingleton.GetInstance: TSingleton;
Begin
If Not Assigned( Instance ) Then
Instance := TSingleton.Create;
Result := Instance;
End;
Class Function TSingleton.NewInstance: TObject;
Begin
If Not Assigned( Instance ) Then
Instance := TSingleton( Inherited NewInstance );
Result := Instance;
End;
其实也是在这里判断静态变量是否创建了.
测试一下:
Procedure TForm2.Button1Click( Sender: TObject );
Var
A, B: TSingleton;
Begin
A := TSingleton.Create;
B := TSingleton.Create;
ShowMessageFmt( 'a:%8x,b:%8x', [ Integer( A ), Integer( B ) ] );
End;
我们可以看见Create后的A,B 以及GetInstance后的对象地址都是一样的.
我们可以看到Delphi要实现单例模式就是靠重载NewInstance方法,因为我们在前面文章看见,对象的构造过程中CreateInstance是最重要的一步.
适用性:

  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
好的今天就说到这里,我是DH.

转:https://www.cnblogs.com/huangjacky/archive/2009/12/08/1619781.html



推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
author-avatar
鄢都浪子_562
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有