穿越到java王国之单例模式屋

来源:互联网 发布:任职资格 知乎 编辑:程序博客网 时间:2024/04/29 09:49

                                             穿越到java王国之单例模式屋

   小C拉着女朋友来上java课,老师在讲台上口若悬河,同学们都睁大了求知的眼睛。小C有点昏昏欲睡,迷迷糊糊中听到老师说:“你们学会了java的基础语法之后,还会接触到设计模式的知识。java的学习曲线不同于C++之类的语言,它的学习曲线比较平滑,虽然刚开始比较容易上手,但是始终有好多知识需要你学习。java的设计模式,比较经典的有23种,当然现在已经衍生出上百种。。。。。。”23种!我勒个去。小C听了一惊,回头看了看旁边的同学小胖,小胖眨了眨他忧郁的小眼睛,叹了口气。老师接着说:“咱们今天要学会用静态工厂方法来得到类的实例。。。。。。”

    好容易熬到了下课,女朋友第一个冲出教室,结果撞到了谁。小C定睛一看,吓出了一身冷汗,撞到的不是别人正是他的前女友亦倩。她来做什么呢?这家伙,亦倩一看到小C眼圈立刻就红了,哭着喊着要小C和她重新开始。小C女朋友也不是吃素的上去给了亦倩一个耳光。这下同学们可都不着急吃饭了,围了个圈。。。。。。

    小C搞不懂亦倩为什么突然回来找他,更搞不懂这两个女生为什么不找个人少的地方解决问题。凭着超高的智商和情商,小C态度坚决的拒绝了亦倩此时此刻正在给女朋友赔礼道歉。女朋友不依不饶,说她一定要是小C的唯一,他的女朋友只能有一个。小C脑袋大了:“我认识亦倩的时候还不认识你啊,我怎么保证?!”“我不管,我不管,我不管!!!!!!”女朋友踹了小C一脚,跑了。

    回到宿舍的小C是气不打一出来,说来说去都怪亦倩。小C是想着各种方法道歉啊。但是我的女神啊,我怎么才能保证我的女朋友只有一个啊。。小C累的瘫倒到床上,回想起一上午的事情,“设计模式”,“java课”,“唯一的女朋友”。。。。。。

    再次睁开眼睛,小C喊了一句“我靠,难道我穿越了?!”这屋子里的摆设和人类不一样啊。哎,等一下,每个物体上都有个logo,仔细看看刻得是“java”。小C走到屋外,看到门上面的横匾上写着“单例模式屋”。正在疑惑之际,走过来一个白衣少年。“你是小C吧,你好,我是java王国的合法居民,我是String”,白衣少年说着伸出手和小C握手。小C疑惑了:“你是String,那不是字符串的类吗?我现在是在哪里?你怎么知道我是小C?”String说道:“是的,我是字符串String。你不要着急,我慢慢跟你说。你现在来到的是Java王国,不过你现在不是在王国的中心,而是java王国外设的一个小宫殿——设计模式宫殿。用你们人类的思维来说,你是穿越了。java王国每年都会从你们人类挑选一些幸运儿来到java王国学习,也了解一下你们对java的看法,这样在新的jdk中作出改进,你知道java 8快要面世了。来到这里呢,你是安全的,也不会对你生活造成影响。等你学习一段时候之后,就送你回人类的世界。等你在人类世界醒来,就感觉是自己做了一个梦。”小C连连点头:“我还有好多疑问,但是我还是想知道我在这里能学到什么呢?”String:“呵呵,我们给你的安排是让你先学习单例模式,你看Singleton回来了,她才是这个单例模式屋的主人,让她跟你说吧。”

    小C回头一看果然有个美女走过来,她的美决不能用语言描述。小C从未看到过这样有特点的美女,小C想她应该是仙女吧。“小C,你好,我一会还有个演讲,所以不能和你多聊,我先跟你介绍一下我自己,然后你就让String陪你走走吧。”小C赶忙应和:“好的,美女姐姐。” 美女Singleton说:“我叫Singleton,我代表的是单例模式。我最大的特点是独一无二。本来我们还在犹豫挑谁来java王国,但是看到你正在纠结怎么才能只有一个女朋友,这和我的脾气有些相似,于是我就强烈推荐了你,呵呵。”小C赶忙道谢。“我要正式说我的特点了,可能稍微有点难,但是你肯定会马上适应的,毕竟我是你接触的第一个设计模式。”

     Singleton:“单例模式:确保一个类只有一个实例,并提供一个全局访问点。如果在你的程序中你需要一种类的实例只有一个,那么就尽管来找我。呵呵,你可能不太理解,这么说吧。看你女朋友,正常情况下呢,你的女朋友只有一个,她对你那么温柔你们的关系很好。但是突然跑过来一个小三也要做你女朋友,两个女朋友这不是乱套了吗?你看这么说你是不是印象深刻。”小C揉了揉被踹疼的地方,“是这样的,美女姐姐。生活中有时候和程序一样有些东西都只能有一个。”Singleton:“是啊,但是总有一些人不自觉,来搞乱正常的秩序。不是还有什么‘小三也有情,小三也有爱的’论调吗,说到这里我就生气。所以啊,就得严格控制。你女朋友不允许你做的事你就别做。当然你可能不那么听话,所以就得采取措施,比如没收你的银行卡。你回答我几个问题,第一个在java中你怎么创建一个对象?”小C:“类名 = new 类名()”。“没错,你依靠构造函数来创建实例,就比如有些男生女生利用银行卡的钱来养小三。所以从根本上解决问题就得限制他的构造函数。你这么聪明我就直接说了:把该类的构造函数设成private,这样外人就无法利用构造函数实例化了。”小C:“这没问题,但是谁来构建该类的实例呢,他自己吗?”Singleton“对的,在类中自己构建实例。有一点值的注意,是类调用构造函数,不是对象调用构造函数。因为外部无法构建该类的实例,所以就不能用实例调用该函数。但是java里有Static关键字,用它来修饰函数,这可以直接用 类.函数名 来调用函数。下面是我经典的一种实现方法,你仔细看下”

GrilFriend的实现代码

 class GrilFriend {
private static GrilFriend uniqueInstance = null;
private GrilFriend(){                                                 //关键点 把构造函数设成private

}
public static GrilFriend getInstance(){//关键点 getInstance得是static的
if(uniqueInstance == null ){                             //如果uniqueInstance还未创建,则创建
uniqueInstance = new GrilFriend();       //否则返回已经创建好的uniqueInstance的引用
}
return uniqueInstance;
}



GridFriend的测试类GridFriedTest:

public class GrilFriendTest {
public static void main(String[] args){
//用GridFriend的getInstance()获得实例,将getInstance看做是全局访问点
GrilFriend GrilFriend1 = GrilFriend.getInstance();  //调用一次getInstance()
GrilFriend GrilFriend2 = GrilFriend.getInstance(); //再调用一次getInstance()
System.out.println(GrilFriend1==GrilFriend2);
}
}



public class GrilFriendTest {
public static void main(String[] args){
//用GridFriend的getInstance()获得实例,将getInstance看做是全局访问点
GrilFriend GrilFriend1 = GrilFriend.getInstance();  //调用一次getInstance()
GrilFriend GrilFriend2 = GrilFriend.getInstance();  //再调用一次getInstance()
System.out.println(GrilFriend1==GrilFriend2);
}
}





}



 “从代码上看创建了两次GrilFriend类的实例,最后通过比较两次实例的引用可以看到结果为“true”,也就是说引用同一个对象,也就是说只有一个GridFriend的实例。对了,这个程序是在JVM老兄赠送的机器上跑的,小C你如果有空可以去他家坐坐。噢!我要迟到了,拜拜了,小C,还有我的一些故事这次讲不完了,我得先走了。”

    小C望着Singleton远去的背影意犹未尽,String在背后拍了他一下:“走吧,小C,我带你去别处转,对了带上Singleton给你的代码,有不懂的改日再来拜访~”



原创粉丝点击