粗看日本设计文档

Posted on

粗看日本设计文档

粗看日本设计文档

今天有幸拿到一份同行兄弟给我的对日外包软件设计文档,很平常的Excel文档,打开一看内容却感到非常不一般,以前听说过日本IT企业的“认真地死板”,今天算是感受到了。 这份文档分8个sheet,每个sheet明确针对不同描述领域,分别为:链接、版本修正、软件架构和业务物理模型、界面原型、界面原形元素设定(包含初始化)、界面原形元素数据实现顺序、动作实现顺序、底层数据集描述和实现。怎么说呢?我算是看到过很多设计文档的人了,国内的、欧美的,这次加上日本的算是全了70%了,我不想对日本发什么感慨,我只是想从这份文档本身出发谈谈看法。

  1. 为什么要有独立的链接页面? 其实这个问题我不用多说,但凡是在IT行业做过的都知道这个行业有个很大的特色:早先没什么文档,自从CMM能增加企业光亮开始,文档一夜之间就铺天盖地的出来了,甚至有段时间国内出现了文档容量攀比态度,各个公司之间,每个IT从业人员之间相互比对谁拥有的文档多,多意味着什么?专业啊!问题是文档多了管理这些文档也麻烦了,不是丢了就是被某些糊涂蛋删除了,幸好聪明的国人想到了配置管理,我把这些文档分分类放到配置管理库那么就一切OK了。我曾经入职过一家国内的大公司,第一天上班“师傅”就带给我一个10G的资料让我“学习”,我对这些文档的第一个印象就是支离破碎,看完这个刚有点感觉想看下面的时候,找不到后面的资料了,当我找到后面资料时思想全乱了,一天下来头昏脑涨,这也是我看到的最讲究逻辑的行业做的最糟糕逻辑的事情了! 所以文档有个链接就非常好了,你可以让每个孤立的文档连成一个整体,让阅读者的思维通畅起来。回过头我重新看了一下RUP2000,里面的文档也是非常讲究相互链接的,不知道为什么这么好的东西到了中国就“消失”了。
  2. 版本修正 我觉得国内只要是想正儿八经做IT的都会在各自的文档上加这个,只不过很多人没有考虑一个阅读的科学性,我以前的文档全是在目录后跟版本修正,这样的话如果一份文档变动非常频繁,那么会造成页面下拉厉害影响视觉。有个细节是,这份日本设计文档的版本修订区是根据每个sheet做修订大项的,每个sheet的细节分类变更包含其中,这样可以跟踪得很细。我们原来的文档着这方面却可以看出,细心的人写的细,粗心的人写的粗,总之在标准的文档也会有不标准的地方。
  3. 软件架构和业务物理模型 国内也有,至少我以前接触的文档就有这方面的内容,不过大多数是根据欧美风格来的,大框架的描述的非常精美,如果你想看细节架构和数据流就没了。这份日文设计单独开辟了一个sheet专门描述着描述这件事情,选用的图形比较中规中矩,看了以后至少知道什么是入口,中间经过何等处理,最后的输出是什么或者什么形式。看来日本并没有大规模推广UML语言,他们就是用了office提供的图形,我现在有些搞不清楚了,国内很多企业标榜自己的设计完全UML化,出来的文档很专业,结果是少数人看的懂,也许在某些国人眼里,设计就是那天上的月亮岂能让凡夫俗子把玩乎?! 文档的细节是将模型中出现的文字都一一作了解释,有点词汇表的意思,但是没有RUP中词汇表那么大的作用范围。
  4. 界面原型 原型这东西最能让阅读者快速理解,2000年开始国内很多IT企业就讲究 快速原型开发方法,但是至今我没看到过一份设计文档带原型,有的是有不过是后期开发完成后补的,这是聪明人做的事情。我看这份文档,到这里我已经完全明白要做什么了,至少我不会担心我要自己设计什么稀奇古怪的东西。另外这个sheet标注了项目说明,这样结合原型我又能多理解很多东西。说BUG大部分都是出现在需求和设计阶段,如果你能100%理解你要做什么了,怎么会让BUG穿透这么多层面流到客户地方去?
  5. 界面原形元素设定 到这里我作为一个曾经的开发人员就要动手准备做了,本sheet详细描述了整个界面所用到的GUI元素,编程变量名称,类型,长度,格式例子等等,还有GUI元素的坐标。其实我理解到了开发阶段,基本上就是光做不说的阶段,你还能指望有几个开发需要大量的 激情创造 才能生存下去?所以说,国内的开发吃欧美的编程天才的毒蘑菇吃多了,产生了愉悦的精神幻觉,要知道图灵只有一个他死在美国!
  6. 界面原形元素数据实现顺序 这个要详细看看,其实这个sheet我理解的也不是很好,但是从含义来看是对GUI接收和反馈数据作的一个约定,哪些GUI元素是接收数据的,哪些GUI元素是反馈数据的,感觉就是很细节,是对前面一个sheet的补充。
  7. 动作实现顺序 国内有个不好的习惯,习惯让测试人员最后写操作手册,我不知道这个是谁发明的并且第一个开始,我只知道这样的人在IT中对IT标准化是个莫大的嘲笑。这份sheet详细描述了整个界面的操作动作,结合界面元素的不同组合详细写出业务可接收处理过程,如果你要写操作手册,只要结合VBS就可以快速生成一份XX软件操作手册,何必再劳师动众让本已经疲于奔命的测试人员写呢?
  8. 底层数据集描述和实现 这部分详细设计经过GUI收集的数据最终存储问题,国内很多都有这方面的描述,这一块日本作的实际了点,数据名称跟前太GUI元素作了捆绑指定,看了整个设计就通畅了。 最后要说明的是,这只是一份普普通通的日本软件设计文档,设计的内容是一个很小很小的资金查询,这样的东西以前我一天可以做好几个,但是到今天为止我做不出这么详细的设计文档。我觉得现在非常有必要反思一下我的测试用例设计文档 细节决定成败 我不愿意落在口头上。 今天的发文不代表任何含义,希望国内IT同仁们继续努力!

http://hi.baidu.com/thing/blog/item/0d0e43a967e3a5fa1f17a27c.html/cmtid/63b2d72a82c79b21d42af193

用java取得mac地址_chinalwb的空间_百度空间

Posted on

用java取得mac地址chinalwb的空间百度空间

分享到

百度分享

扫描打印一体机 请找 QQ: 751510471, 329055754 EPSON ¥1,2500 长期合作 有优惠

2010-07-20 17:14

用java取得mac地址

项目中用到的一个方法 比较粗糙 没做整理 先记录下来 String getMacAddress() { String macadd = "Any"; if (macaddress != null){ //System.out.println("Returning static macaddress"); return macaddress; } // On Solaris if (Key.getRuntimeOS() == LicUtil.SUNOS){ String cmd = "/usr/bin/hostid"; BufferedReader br = null; try { Process p = Runtime.getRuntime().exec(cmd); br = new BufferedReader(new InputStreamReader(p.getInputStream())); String sLine = null; if ((sLine = br.readLine()) != null) { macadd = sLine.trim(); macaddress = macadd; } } catch (Exception ex) { } finally { try { if (br != null) br.close(); } catch (Exception ex) {} } } else if (Key.getRuntimeOS() == LicUtil.HPUX){ // On HP String cmd = "/usr/sbin/lanscan -a"; BufferedReader br = null; try { Process p = Runtime.getRuntime().exec(cmd); br = new BufferedReader(new InputStreamReader(p.getInputStream())); String sLine = null; if ((sLine = br.readLine()) != null) { macadd = sLine.trim(); macaddress = macadd; } } catch (Exception ex) { } finally { try { if (br != null) br.close(); } catch (Exception ex) {} } } else if (Key.getRuntimeOS() == LicUtil.IBMAIX){ // On IBMAIX String cmd = "/usr/bin/uname -m"; BufferedReader br = null; try { Process p = Runtime.getRuntime().exec(cmd); br = new BufferedReader(new InputStreamReader(p.getInputStream())); String sLine = null; if ((sLine = br.readLine()) != null){ macadd = sLine.trim(); macaddress = macadd; } } catch (Exception ex) { } finally { try { if (br != null) br.close(); } catch (Exception ex) {} } } else if (Key.getRuntimeOS() == LicUtil.LINUX){ // On Linux String cmd = "/sbin/ifconfig eth0"; BufferedReader br = null; try { Process p = Runtime.getRuntime().exec(cmd); br = new BufferedReader(new InputStreamReader(p.getInputStream())); String sLine = null; if ((sLine = br.readLine()) != null) { sLine = sLine.trim(); StringTokenizer st = new StringTokenizer(sLine); while (st.hasMoreTokens()) { String tmp = st.nextToken(); if (tmp.equals("HWaddr")) { macadd = st.nextToken(); macaddress = macadd; break; } } } // Add IP address - specail case on Linux if ((sLine = br.readLine()) != null) { sLine = sLine.trim(); StringTokenizer st = new StringTokenizer(sLine); while (st.hasMoreTokens()) { String tmp = st.nextToken(); if (tmp.startsWith("addr:")) { setIP(tmp.substring(5)); break; } } } } catch (Exception ex) { } finally { try { if (br != null) br.close(); } catch (Exception ex) {} } } else if (Key.getRuntimeOS() == LicUtil.WIN){ // On Windows // Yes, popup String cmd = "cmd /c start /min ipconfig /all"; // 0519 more popup thane 0518 String cmd = "cmd /c ipconfig /all"; // 0518 Still see Popup from installer String cmd = "start /min ipconfig /all"; // Get Error in MacAddress
// Pop Up Windows in installer String cmd = "ipconfig /all"; BufferedReader br = null; try { Process p = Runtime.getRuntime().exec(cmd); br = new BufferedReader(new InputStreamReader(p.getInputStream())); String sLine = null; while ((sLine = br.readLine()) != null) { sLine = sLine.trim(); if (sLine.indexOf("Physical Address") != -1){ StringTokenizer winst = new StringTokenizer(sLine, ":"); winst.nextToken(); macadd = winst.nextToken().trim(); macaddress = macadd; //System.out.println("Setting static macaddress"); break; } continue; } } catch (Exception ex) { } finally { try { if (br != null) br.close(); } catch (Exception ex) {} } } return macadd; } /#Java

分享到:

举报 浏览(213) 评论 转载

您可能也喜欢

评论

同时评论给

同时评论给原文作者

发布

500/0

收起|查看更多

帮助中心 | 空间客服 | 投诉中心 | 空间协议

©2012 Baidu a

b c

d e

f

探究 Singleton 设计模式

Posted on

探究 Singleton 设计模式

探究 Singleton 设计模式(构建分布式应用程序)

来源:www.microsoft.com 来源:UML软件工程组织

摘要:

讨论 Singleton 设计模式(指示如何以及何时创建对象的创造性模式)及其在 Microsoft .NET 框架中的有效使用。

内容

简介

Singleton 模式

结论

简介

在开发软件应用程序过程中,随着应用程序的开发,会出现重复性的模式。 随着整个软件系统的开发,很多相同的模式会逐渐显现出来。

这种重复性模式概念在其他应用中是非常明显的。 汽车制造就是一种此类应用。 很多不同的汽车型号使用相同的子构件,包括大多数基本部件(例如,灯泡和紧固零件)以及较大的构件(例如,底盘和发动机)。

在住宅建筑中,重复性模式概念适用于螺丝和螺钉以及整体总体建筑物配电系统。 无论组建的小组是为了开发新的汽车设计还是新的建筑物设计,它其通常不必没有考虑到以前已解决的问题。 如果设计和建筑住宅的小组必须重新构思和设计房子的每一个组成部分,则整个过程所花的时间比现在要长得多。 门高或灯开关功能等许多设计决策(例如,门高或灯开关功能)很容易理解。 房为满足给房子不同部分提供洗手功能的要求,房屋设计师不必重新设计和重新建造不同类型的输供水和蓄水设施:,以便达到为房子不同部分提供洗手功能的要求: 标准水槽以及标准的热水和冷水输入接头和排水输出接头是很容易理解非常常见的房屋建筑构件。 可以将重复性模式概念反复应用于我们周围的几乎每样东西上,包括软件。

汽车和住宅建筑示例有助于在软件设计和构造中体现某些一般性的抽象概念。 易于理解且明确定义的通用功能部件的概念是设计模式的源动力,它也是其他两篇设计模式文章探究工厂设计模式和探究观察者设计模式的重点。 这些模式几乎涵盖了面向对象的软件设计的各个方面,包括对象创建、对象交互和对象生存期。 在本文中,我们将讨论 Singleton 模式,它包含在创造性模式系列中。

创造性模式指示如何以及何时创建对象。 很多实例需要只能通过创造性方法解决的特殊行为,而不是在创建实例后强制实施所需的行为。 此类行为要求最好的例子之一包含在 Singleton 模式中。 Singleton 模式在 Design Patterns: Elements of Reusable Software 这一经典参考书目中有正式的定义,该书的作者包括 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(也称为四人组或 GoF)。 在 Design Patterns 中,此模式是最简单也是使用最广泛的模式之一。 但是,正如我们将会看到的一样,在实现此模式时可能会出现一些问题。 本文试图通过 Singleton 模式的多个早期实现来从头开始分析 Singleton 模式,以及如何在 Microsoft_ .NET 应用程序开发中发挥其最佳用途。

Singleton**模式**

按照 Design Patterns 中的定义,Singleton 模式的用途是 "ensure a class has only one instance, and provide a global point of access to it"(确保每个类只有一个实例,并提供它的全局访问点)。

它可以解决什么问题,或者换句话说,我们使用它的动机是什么? 几乎在每个应用程序中,都需要有一个从中进行全局访问和维护某种类型数据的区域。 在面向对象的 (OO) 系统中也有这种情况,在此类系统中,在任何给定时间只应运行一个类或某个类的一组预定义数量的实例。 例如,当使用某个类来维护增量计数器时,此简单的计数器类需要跟踪在多个应用程序领域中使用的整数值。 此类需要能够增加该计数器并返回当前的值。 对于这种情况,所需的类行为应该仅使用一个类实例来维护该整数,而不是使用其它类实例来维护该整数。

最初,人们可能会试图将计数器类实例只作为静态全局变量来创建。 这是一种通用的方法,但实际上只解决一部分问题;它解决了全局可访问性问题,但没有采取任何措施来确保在任何给定的时间只运行一个类实例。 应该由类本身来负责只使用一个类实例,而不是由类用户来负责。 应该始终不要让类用户来监视和控制运行的类实例的数量。

所需要的是使用某种方法来控制如何创建类实例,然后确保在任何给定的时间只创建一个类实例。 这会确切地给我们提供所需的行为,并使客户端不必了解任何类细节。

逻辑模型

Singleton 模型非常简单直观。 (通常)只有一个 Singleton 实例。 客户端通过一个已知的访问点来访问 Singleton 实例。 在这种情况下,客户端是一个需要访问唯一 Singleton 实例的对象。 图 1 以图形方式显示此关系。

图 1. Singleton 模式逻辑模型 图1. Singleton模式逻辑模型

物理模型

Singleton 模式的物理模型也是非常简单的。 但是,随着时间的推移,实现 Singleton 的方式也略有不同。 让我们看一下原始的 GoF Singleton 实现。 图 2 显示按 Design Patterns 所定义的原始 Singleton 模式的 UML 模型。

图 2. Design Patterns 中的 Singleton 模式物理模型 图2. Design Patterns中的Singleton模式物理模型

我们看到的是一个简单的类图表,显示有一个 Singleton 对象的私有静态属性以及返回此相同属性的公共方法 Instance()。 这实际上是 Singleton 的核心。 还有其他一些属性和方法,用于说明在该类上允许执行的其他操作。 为了便于此次讨论,让我们将重点放在实例属性和方法上。

客户端仅通过实例方法来访问任何 Singleton 实例。 此处没有定义创建实例的方式。 我们还希望能够控制如何以及何时创建实例。 在 OO 开发中,通常可以在类的构造函数中最好地处理特殊对象的创建行为。 这种情况也不例外。 我们可以做的是,定义我们何时以及如何构造类实例,然后禁止任何客户端直接调用该构造函数。 这是在 Singleton 构造中始终使用的方法。 让我们看一下 Design Patterns 中的原始示例。 通常,将下面所示的 C++ Singleton 示例实现代码示例视为 Singleton 的默认实现。 本示例已移植到很多其他编程语言中,通常它在任何地方的形式与此几乎相同。

C++ Singleton**示例实现代码**

Language**cpp, parsed in: 0.004 seconds, using GeSHi 1.0.7.12**

  1. // Declaration

  2. class Singleton {

  3. public:

  4. static Singleton/* Instance();

  5. protected:

  6. Singleton();

  7. private:

  8. static Singleton/* _instance;

  9. }

  10. // Implementation

  11. Singleton/* Singleton::_instance = 0;

  12. Singleton/* Singleton::Instance() {

  13. if (_instance == 0) {

  14. _instance = new Singleton;

  15. }

  16. return _instance;

  17. }

让我们先花点时间分析一下此代码。 该简单类有一个成员变量,此变量是指向该类自身的指针。 注意,构造函数是受保护的,并且只有公共方法才是实例方法。 在实例方法实现中,有一个控制块 (if),它检查成员变量是否已初始化,如果没有的话,则创建一个新实例。 控制块中这种惰性初始化意味着仅在第一次调用 Instance() 方法时初始化或创建 Singleton 实例。 对于很多应用程序,这种方法效果很好。 但对于多线程应用程序,这种方法证明具有潜在危险的副作用。 如果两个线程同时进入控制块,则可能会创建该成员变量的两个实例。 要解决这一问题,您可能想只将重要部分放在控制块周围以确保线程安全。 如果您这样做,则将对实例方法的所有调用进行序列化处理,并且可能会对性能产生不利影响(取决于应用程序)。 正是由于这个原因,创建了此模式的另一个版本,它使用某种称为双重检验机制的功能。 下一个代码示例显示使用 Java 语法的双重检验锁定。

使用 Java 语法的双重检验锁定 Singleton 代码

Language****java, parsed in: 0.011 seconds, using GeSHi 1.0.7.12

  1. // C++ port to Java

  2. class Singleton

  3. {

  4. public static Singleton Instance() {

  5. if (_instance == null) {

  6. synchronized (Class.forName("Singleton")) {

  7. if (_instance == null) {

  8. _instance = new Singleton();

  9. }

  10. }

  11. }

  12. return _instance;

  13. }

  14. protected Singleton() {}

  15. private static Singleton _instance = null;

  16. }

在使用 Java 语法的双重检验锁定 Singleton 代码示例中,我们直接将 C++ 代码移植到 Java 代码,以便利用 Java 关键部分块(已同步)。 主要差别是不再有单独的声明和实现部分,没有指针数据类型,并且采用了新的双重检验机制。 双重检验发生在第一个 IF 块上。 如果成员变量为空,则执行进入关键部分块,该块再次双重检验该成员变量。 仅在通过此最终测试后,才会实例化该成员变量。 一般来说,两个线程无法使用这种方法创建两个类实例。 另外,因为在第一次检查时没有出现线程阻塞,所以对此方法的大多数调用不会由于必须进入锁定而导致性能下降。 目前,在实现 Singleton 模式时,很多 Java 应用程序中都广泛使用这种方法。 这种方法很巧妙,但也有瑕疵。 某些优化编译器可以将惰性初始化代码优化掉或对其重新进行排序,并且会重新产生线程安全问题。 有关更深入的解释,请参阅 "The Double-Check Locking is Broken" Declaration。

另一种试图解决此问题的方法可能是,在成员变量声明中使用 volatile 关键字。 这应该告诉编译器不要对代码重新排序,并且放弃优化。 目前,这是唯一建议的 JVM 内存模型,并且不会立即解决该问题。

实现 Singleton 的最好方法是什么? 最终(而不是碰巧),Microsoft .NET 框架解决了所有这些问题,从而更易于实现 Singleton,却不会产生我们目前讨论的不利副作用。 .NET 框架以及 C/# 语言允许我们在必要时通过替换语言关键字,将上述的 Java 语法移植到 C/# 语法。 因此,Singleton 代码变为以下内容:

以 C/# 编码的双重检验锁定

Language**csharp, parsed in: 0.005 seconds, using GeSHi 1.0.7.12**

  1. // Port to C/#

  2. class Singleton

  3. {

  4. public static Singleton Instance() {

  5. if (_instance == null) {

  6. lock (typeof(Singleton)) {

  7. if (_instance == null) {

  8. _instance = new Singleton();

  9. }

  10. }

  11. }

  12. return _instance;

  13. }

  14. protected Singleton() {}

  15. private static volatile Singleton _instance = null;

  16. }

此处,我们替换了锁定关键字来执行关键部分块,使用 typeof 操作并添加 volatile 关键字,以确保没有对代码进行优化程序重新排序。 虽然此代码或多或少是 GoF Singleton 模式的直接移植,但它可达到我们的目的,并且我们可获得所需的行为。 此代码还说明了将 C++ 移植到 Java 和将 Java 移植到 C/# 代码的一些相似之处和主要差别。 但是,正如任何代码移植一样,通常目标语言或平台的一些优点可能在移植过程中失去。 需要做的就是对代码重构,以便利用新目标语言或平台的功能。

在前面的每个代码示例中,Singleton 的原始实现随时间的推移而发生变化,以解决在每个新模式实现中发现的问题。 一些问题(例如,线程安全)要求对大多数实现进行更改,以满足在目前应用程序中日益增长的需要并解决演变发展问题。 .NET 在应用程序开发中提供了一个演变步骤。 可以在“框架”级别解决前面示例中出现的很多亟待解决的问题,而不是在实现级别解决。 虽然上一个示例显示了一个使用 .NET 框架和 C/# 的有效 Singleton 类,但只需更好地利用 .NET 框架本身就可以大大简化此代码。 以下示例使用 .NET,它是一个松散地基于原始 GoF 模式的最小限度的 Singleton 类,并且仍然可获得类似的行为。

.NET Singleton**示例**

Language**csharp, parsed in: 0.002 seconds, using GeSHi 1.0.7.12**

  1. // .NET Singleton

  2. sealed class Singleton

  3. {

  4. private Singleton() {}

  5. public static readonly Singleton Instance = new Singleton();

  6. }

此版本已大大简化并且更加直观。 它仍然是 Singleton 吗? 让我们看一下更改了哪些内容,然后再做决定。 我们修改了要密封的类本身(该类密封后是不可继承的),删除了惰性初始化代码,删除了 Instance() 方法,并且对 _instance 变量做了大量的修改。 对 _instance 变量所做的更改包括修改对公共方法的访问级别,将变量标记为只读,以及在声明时初始化该变量。 此处,我们可以直接定义所需的行为,而不关心实现的潜在有害的副作用。 那么,使用惰性初始化有什么优点以及使用多个线程有什么危险呢? 在 .NET 框架中内置了所有正确的行为。 让我们先看第一种情况:惰性初始化。

最初使用惰性初始化的主要原因是要获取仅在第一次调用 Instance() 方法中创建实例的行为,还因为 C++ 规范中具有某种开放性,并不定义静态变量的确切初始化顺序。 要在 C++ 中获得所需的 Singleton 行为,必须采用涉及使用惰性初始化的运算方法。 我们真正关心的是在第一次(在该情况下)调用实例属性中创建该实例,还是在此调用之前创建该实例的,并且类中的静态变量是否有已定义的初始化顺序。 对于 .NET 框架,这就是我们获取的行为。 在 JIT 过程中,当(且仅当)任何方法使用静态属性时,“框架”将初始化此静态属性。 如果没有使用该属性,则不会创建实例。 更准确地说,在 JIT 过程中发生的事情就是,在任何调用方使用该类的任何静态成员时构造和加载该类。 在这种情况下,结果是相同的。

那么,线程安全初始化呢? “框架”也解决了这一问题。 “框架”内部保证静态类型初始化的线程安全。 换句话说,在上面的示例中,只创建一个 Singleton 类实例。 还要注意,用于保存类实例的属性字段称为实例。 此选项更好地说明了,在本文中的讨论过程中,此值是类的实例。 在“框架”本身中,虽然使用的属性名称称为值,但有多个类使用此类型的 Singleton。 概念完全相同。

对类所做的其他更改意味着禁止划分子类。 添加密封类修饰符可确保不会将该类划分为子类。 GoF Singleton 模式详细介绍了试图对 Singleton 划分子类所产生的问题,该划分通常并不是小事。 在大多数情况下,可以很容易地开发没有父类的 Singleton,并且添加划分子类功能会增加通常根本不需要的新的复杂性级别。 随着复杂性的提高,测试、培训和文档编制等所需的时间也会增加。 通常,除非绝对必要,否则您不希望提高任何代码的复杂性。

让我们看一下如何使用 Singleton。 使用我们最初的计数器的有关动机的概念,我们可以创建一个简单的 Singleton 计数器类并说明我们将如何使用它。 图 3 显示了 UML 类说明将包含什么内容。

图 3. UML 类图表 图 3. UML 类图表

相应的类实现代码以及示例客户端使用如下所示。

示例 Singleton 使用

Language**csharp, parsed in: 0.007 seconds, using GeSHi 1.0.7.12**

  1. sealed class SingletonCounter {

  2. public static readonly SingletonCounter Instance =

  3. new SingletonCounter();

  4. private long Count = 0;

  5. private SingletonCounter() {}

  6. public long NextValue() {

  7. return ++Count;

  8. }

  9. }

  10. class SingletonClient {

  11. [STAThread]

  12. static void Main() {

  13. for (int i=0; i<20; i++) {

  14. Console.WriteLine("Next singleton value: {0}",

  15. SingletonCounter.Instance.NextValue());

  16. }

  17. }

  18. }

此处,我们还创建了一个 Singleton 类来维护具有 long 类型的增量计数。 客户端是一个简单的控制台应用程序,它显示计数器类的 20 个值。 虽然此示例极其简单,但它却说明了如何使用 .NET 来实现 Singleton,然后将其用在应用程序中。

小结

Singleton 设计模式是一个非常有用的机制,可用于在面向对象的应用程序中提供单个对象访问点。 无论使用的是什么实现,该模式提供一个大家所熟知的概念,以便其在设计和开发小组之间方便地进行共享。 但是,正如我们所发现的一样,注意到这些实现有多大差异及其潜在的副作用也是非常重要的。 .NET 框架为模式实现者在设计所需的功能类型方面提供了很大的帮助,实现者无需处理本文中所讨论的很多副作用。 在正确实现后,可以证实模式的最初目的的有效性。

设计模式是非常有用的软件设计概念,可使小组将重点放在提供最佳类型的应用程序上,而不考虑它们是什么应用程序。 关键在于正确而有效地使用设计模式,目前有很多关于将设计模式用于 Microsoft .NET 方面的 MSDN 系列文档,其中介绍了如何正确而有效地使用设计模式。

用java删除文件夹里的所有文件

Posted on

用java删除文件夹里的所有文件

Java on Line

和java的日子!

BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合 :: 管理 :: 8 随笔 :: 0 文章 :: 8 评论 :: 0 Trackbacks

< 2007年10月 > 日 一 二 三 四 五 六 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10

公告

谢谢您的关注!!!

留言簿(1)

随笔分类(8)

随笔档案(8)

相关连接

搜索

*

最新评论

import java.io.File; public class Test { public static void main(String args[]){ Test t = new Test(); delFolder("c:/bb"); System.out.println("deleted"); } //删除文件夹 //param folderPath 文件夹完整绝对路径 public static void delFolder(String folderPath) { try { delAllFile(folderPath); //删除完里面所有内容 String filePath = folderPath; filePath = filePath.toString(); java.io.File myFilePath = new java.io.File(filePath); myFilePath.delete(); //删除空文件夹 } catch (Exception e) { e.printStackTrace(); } } //删除指定文件夹下所有文件 //param path 文件夹完整绝对路径 public static boolean delAllFile(String path) { boolean flag = false; File file = new File(path); if (!file.exists()) { return flag; } if (!file.isDirectory()) { return flag; } String[] tempList = file.list(); File temp = null; for (int i = 0; i < tempList.length; i++) { if (path.endsWith(File.separator)) { temp = new File(path + tempList[i]); } else { temp = new File(path + File.separator + tempList[i]); } if (temp.isFile()) { temp.delete(); } if (temp.isDirectory()) { delAllFile(path + "/" + tempList[i]);//先删除文件夹里面的文件 delFolder(path + "/" + tempList[i]);//再删除空文件夹 flag = true; } } return flag; } } posted on 2007-10-12 16:19 陈东 阅读(4139) 评论(0) 编辑 收藏 所属分类: Java基础

新用户注册 刷新评论列表

淘宝网诚聘资深J2ME开发工程师 IT新闻: · WiFi网络不稳定 业界称iPad恐难扎根国内 · 福布斯:中兴超越摩托罗拉成全球第五大手机商 · 报告称谷歌正在内测桌面版Google Voice · 苹果iPad热度不减 5天销量已达到60万部 · 苹果明年或推小号iPad 采用5英寸屏幕 专题:Android iPad jQuery Chrome OS 博客园首页 IT新闻 知识库 学英语 Java程序员招聘 标题 请输入标题 姓名 请输入你的姓名 主页 请输入验证码 验证码 /* 内容(请不要发表任何与政治相关的内容) 请输入评论内容 Remember Me? 登录 [使用Ctrl+Enter键可以直接提交] 每天10分钟,轻松学英语 推荐职位: · 飞信服务器端高级.NET开发工程师(新媒传信) · .NET飞信官网开发工程师(新媒传信) · Web前端研发工程师(百度) · C++开发工程师(沪江网) · 前端开发工程师(沪江网) · 产品经理(沪江网) · 运维工程师(沪江网)

博客园首页随笔: · 群发“站内信”的实现(续) · 数据库索引白话篇 · 18个不常见的C/#关键字,您使用过几个? · windows下信号机制的学习 · 团队基础生成自动化流程之最佳实践(VI) - 系统模块化条件编译 知识库: · 如何做网页设计的10个小窍门 · 社区媒体和网站的九个关键性界面特征 · 从零到十亿,创业企业家如何迈向成功? · 如何精简用户界面 · 每天进步一点点,一个月后,一年后,十年后,百年后... 网站导航:

博客园 IT新闻 个人主页 博客生活 IT博客网 C++博客 博客园社区 管理 相关文章:

Powered by: BlogJava Copyright © 陈东

服务器以及浏览器缓存影响Web开发问题

Posted on

服务器以及浏览器缓存影响Web开发问题 - 品味开发乐趣 - CSDN博客

品味开发乐趣

寒雨连江夜入吴 平明送客楚山孤 洛阳亲友如相问 一片冰心在玉壶

*

用户操作[留言] [发消息] [加为好友] 订阅我的博客XML聚合 FeedSky订阅到鲜果订阅到Google订阅到抓虾[编辑]devfan的公告[编辑]文章分类* (RSS).NET

发表于 @ 2009年05月08日 16:14:00 | 评论( loading... )| 编辑| 举报| 收藏

旧一篇:windows7 RC 体验(安装与汉化以及开发兼容性) | 新一篇:直接关闭IE,释放Session

Copyright © devfanPowered by CSDN Blog