`
寻梦者
  • 浏览: 635632 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

单例模式-----<ant求职记之设计模式>

阅读更多

     大家好,我是ant,今天是我开始创作《ant求职记之设计模式》的第一天,作为一名刚踏出象牙塔的应届毕业生,跟很多人一样,在经历着人生的一个特殊历程:求职。这对我们每个人说都是十分重要的。而求职的艰辛或许大家都能体会得到。

      最近翻看了表哥给我的《Head First Design Pattern》,感觉很有意思,于是产生了一个想法,将自己的求职经历用各种设计模式表现出来。这不仅仅是对design pattern的学习总结,也可以算是对求职历程的程序记录。相信,它会变得很有意思的。

      恩,好了,现在俺切入正题,开始我们的设计模式之旅吧。

   

      ok,首先简单介绍下我自己吧,请看如下代码:

package com.ant.single.domain;

public class StuAnt {
	private static StuAnt ant;
	private static int stuNum=0;
	private String name = "geyubin";
	private String college = "jxxy";

	private StuAnt() {
	}
	
    //get the single instantce
	public static StuAnt getInstance() {
		if (ant == null) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			ant = new StuAnt();
			stuNum++;			
		}
		return ant;
	}

	public void getPersonInfo() {
		if(stuNum==1){
			System.out.println("my name is " + name + " and my graduteSchool is "
					+ college);
		}else{
			System.out.println("sorry,it's not a single pattern");
		}
	}
}

 

     在本人信息类里面,我将构造方法私有化了,这样保证了其它类无法直接创建StuAnt的实例,而getInstance()作为访问StuAnt类的唯一入口,提供了单一StuAnt实例的创建。 由于本人是唯一的,为了检验这种特性,我在getPersonInfo()中调用了stuNum。

      为了描述自己,我写了两份不同的简历,并进行检查是否描述的是同一个我:

package com.ant.single.test;

import com.ant.single.domain.StuAnt;

//the class of ant resume
class Resume implements Runnable {

	@Override
	public void run() {
		StuAnt ant = StuAnt.getInstance();
		ant.getPersonInfo();
	}

}

// check the resums whether describe me in the correct way or not
public class StuTest {
	public static void main(String[] args) {
		Resume antResume = new Resume();
		Thread antResume1 = new Thread(antResume);
		Thread antResume2 = new Thread(antResume);
		antResume1.start();
		antResume1.start();

	}
}

 

跑一下,我猜两份简历描述的应该是同一个对象吧:

my name is geyubin and my graduteSchool is jxxy
sorry,it's not a single pattern

 

my name is geyubin and my graduteSchool is jxxy
my name is geyubin and my graduteSchool is jxxy

 

sorry,it's not a single pattern
my name is geyubin and my graduteSchool is jxxy

 

  

sorry,it's not a single pattern
sorry,it's not a single pattern

 

 

   怎么程序简历里面描述的对象不一样的,纳闷,怎不是单例。

    难以想象在世界的某个角落居然还有另一个“自己”。22岁的偶,做梦也没遇见过“太空人”着,咋,什么时候就被“克隆”了呢。

    简历里面描述的是另一个自己,那可不是开玩笑的。为了寻求答案,我翻出了自己的“葵花宝典”《head first  design pattern》,琢磨一阵,终于理出了思路:

 

antResume1:

 

1.public static StuAnt getInstance() {
2. if (ant == null) {
3.      ant = new StuAnt(); 
4.  stuNum++;
5.  }
6.  return ant;
7.}

antResume2:

 

1.public static StuAnt getInstance() {

2.
3. if (ant == null) {
4. 

5.  ant = new StuAnt(); 
6.   stuNum++;
7.  }
8.  return ant;
9. }

 

     

    大家看看上面的两个线程吧,这只是其中的一个特例,最后导致了:

 

       

my name is geyubin and my graduteSchool is jxxy
sorry,it's not a single pattern

 

    知道了问题点,那我们该想下如何让线程同步呢,O(∩_∩)O~,sychronized,恩。请看修改后的StuAnt代码:

package com.ant.single.domain;

public class StuAnt {
	private static StuAnt ant;
	private static Integer stuNum=0;
	private String name = "geyubin";
	private String college = "jxxy";

	private StuAnt() {
	}
	
    //get the single instantce
	public static StuAnt getInstance() {
		if (ant == null) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (stuNum) {	
				if(ant==null){
					ant = new StuAnt();	
					stuNum++;
				}
			}
		}
		return ant;
	}

	public void getPersonInfo() {
		if(stuNum==1){
			System.out.println("my name is " + name + " and my graduteSchool is "
					+ college);
		}else{
			System.out.println("sorry,it's not a single pattern");
		}
	}
}

 

    好了,现在再跑跑程序:

my name is geyubin and my graduteSchool is jxxy
my name is geyubin and my graduteSchool is jxxy

 

    ,永远都是同一个实例,(*^__^*) ----简历里的俺是唯一的,不可替代的。 ok,这应该是一个完整的单例模式了。

     准备既然准备好了简历,过几天就去人才市场看看,欲知后事如何,请看“下节”------抽象工厂模式

 

 

    谢谢大家的观看

   

   

 

    

 

 

 

    

 

 

 

 

 

 

 

 

 

   

分享到:
评论

相关推荐

    ant学习打包代码

    &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!--官方网站:... &lt;echo message="ant发现Java虚拟机的版本:${ant.java.version}" /&gt; &lt;echo message="项目的绝对路径:${basedir}"/&gt; &lt;/target&gt; &lt;/project&gt;

    Ant的下载安装和简单地使用

    - 将`&lt;ANT_HOME&gt;`设为Ant的主目录,例如`&lt;ANT_HOME&gt;=E:\Ant\apache-ant-1.7.0`。 - 修改`&lt;PATH&gt;`环境变量,添加`%ANT_HOME%\bin`,确保可以在任意目录下调用Ant命令。 #### 三、Ant的基本使用 Ant的核心功能在于...

    chires包

    -------------------------------------&lt;br&gt;&lt;br&gt;&lt;br&gt;First download aspectwerkz 1.0 and JDK 1.5&lt;br&gt;&lt;br&gt;&lt;br&gt;Install JDK 1.5 if you haven't already&lt;br&gt;&lt;br&gt;&lt;br&gt;Run 'ant dist' in the aspectwerkz directory&lt;br&gt;...

    chires开发包

    -------------------------------------&lt;br&gt;&lt;br&gt;&lt;br&gt;First download aspectwerkz 1.0 and JDK 1.5&lt;br&gt;&lt;br&gt;&lt;br&gt;Install JDK 1.5 if you haven't already&lt;br&gt;&lt;br&gt;&lt;br&gt;Run 'ant dist' in the aspectwerkz directory&lt;br&gt;...

    Ant打多渠道包

    这个文件是Ant的工作蓝图,它定义了构建过程中的各种任务,如编译源代码、打包资源、签名APK等。在`build.xml`文件中,你需要配置项目的基本信息,例如源代码路径、资源路径、输出目录等。此外,为了实现多渠道打包...

    activation等jar

    当前rar包含一下jar包,很多都是我在网上苦苦寻觅而得的,希望对大家有所帮助&lt;br&gt;activation.jar&lt;br&gt;axis.jar&lt;br&gt;axis-ant.jar&lt;br&gt;axis-schema.jar&lt;br&gt;bc-cog-jglobus.jar&lt;br&gt;bcprov-jdk14.jar&lt;br&gt;borlandxml.jar&lt;br&gt;...

    Ant与Junit结合

    标题“Ant与JUnit结合”指的是在Java开发中如何利用Apache Ant构建工具与JUnit测试框架进行集成,以便自动化地运行单元测试。Apache Ant是一种基于XML的构建工具,它替代了传统的Makefile,为Java项目提供了构建、...

    ant 配置文件

    Ant的fileset元素用于定义一组文件或目录,可以通过包括和排除模式进行筛选。这在处理大量文件时非常有用: ```xml &lt;target name="copy-resources"&gt; &lt;copy todir="${build.dir}/resources"&gt; &lt;fileset dir="src/...

    挑战Acegi1.0

    这里的配置指定了过滤器链的定义方式,即使用Apache Ant的模式匹配规则。`filterChainProxy` Bean是Acegi1.0的核心,通过它定义了一组过滤器,这些过滤器按顺序被调用来处理每一个请求。 #### 四、总结 通过以上...

    Tomcat优化1

    &lt;servlet-name&gt;default&lt;/servlet-name&gt; &lt;servlet-class&gt;org.apache.catalina.servlet.DefaultServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet&gt; &lt;servlet-name&gt;jsp&lt;/servlet-name&gt; &lt;servlet-class&gt;org.apache....

    build.xml详解

    &lt;property name="ant.home" value="${env.ANT_HOME}"/&gt; &lt;!-- Ant 安装目录 --&gt; &lt;property name="app.name" value="hello-ant"/&gt; &lt;!-- 应用程序名称 --&gt; &lt;property name="app.jar" value="${app.name}.jar"/&gt; &lt;!-- ...

    jive.chm

    &lt;br&gt;系统设计&lt;br&gt; 1 jive设计思路 &lt;br&gt; 2 jive的工作内幕 &lt;br&gt; 3 Jive源代码研究 &lt;br&gt; 4 Jive中的设计模式 &lt;br&gt; 5 jive学习笔记 &lt;br&gt;&lt;br&gt;&lt;br&gt; &lt;br&gt;设计模式&lt;br&gt; 1 大道至简-Java之23种模式一点就通 &lt;br&gt; 2 设计模式...

    Ant权威指南

    --------------------------------------&lt;br&gt;Ant权威指南----希望此书对你的开发有所帮助。&lt;br&gt;--------------------------------------&lt;br&gt;如果觉得此书好,请购买此书。&lt;br&gt;支持正版。&lt;br&gt;-----------------------...

    Proguard4.2.zip(java编码混淆器)

    Proguard4.2.zip(java编码混淆器)&lt;br&gt;doc是4.0的doc&lt;br&gt;jar包是1.4.2&lt;br&gt;&lt;br&gt;&lt;br&gt;ProGuard, Java class file shrinker, optimizer, and obfuscator&lt;br&gt;===========================================================...

    【JavaScript源代码】antd+vue实现动态验证循环属性表单的思路.docx

    在JavaScript和Vue.js的开发环境中,Ant Design Vue (antd-vue)是一个常用UI库,用于构建用户界面。本文将深入探讨如何使用antd-vue和Vue实现动态验证循环属性的表单,满足以下需求: 1. **名称**、**对比项**和**...

Global site tag (gtag.js) - Google Analytics