张小二求职 之单例模式(一)

单例模式(一)

本文以初级程序员的角度来分析设计模式。

1.请问什么是设计模式?

简单来说就是针对特定问题的解决方案。

2设计模式可以帮助我们什么?

我们在设计数据库的时候有范式理论,还记得不?我不记得了,以后复习。范式理论是指导我们设计数据库的表,他是我们设计数据库的一个指导原则,他的目标是减少冗余。简单来说,作为一个java程序员,我们每天都在写各种各样的类,这些类之间不是孤立的,他们是是有联系的一个整体,不同的类之间协作构成了我们庞大的程序。因此如何设计这些类呢?设计模式就是一些指导我们设计这些类的原则。什么高内聚和低耦合,这块也得复习一下。

3、

同学,你用过哪些设计模式啊,给我们说说吧?

该同学窃喜,因为它昨天刚看了单例模式。于是出现了如下对话?

M表示面官,Z表示张小二:问题会被加粗

M:既然你会单例模式,你写出来一个我看看。(看我问不死你)

z:
package 单例模式;

 class Singleton2 {
     private static Singleton2 instance=new Singleton2();
     private Singleton2()
     {
         System.out.println("对象创建了");
     }
     public static Singleton2 getInstance()
     {
         return instance;

     }

}
 public class Test6
 {
     public static void main(String args[])
     {
         Singleton2 s1=Singleton2.getInstance();
         Singleton2 s2=Singleton2.getInstance();
             

     }

 }

运行两次 getInstace构造函数只调用一次。

M;你这段代码是如何保证每个类只生成一次对象的?

1.类的静态变量只初始化一次

M:不错,但是你你一定还会其他方法吧,这个方法是有缺陷的,因为类的初始化工作不一定只在调用getInstace时候才会出现啊。

Z:是的,即使我们不调用getInstacne,对象也有可能会被创建。因此,我们无法做到按需创建。

例如:

Class.forName("单例模式.Singleton2"); 

这个简单来说就是装载类,就是把class文件装载到虚拟机上,这个与反射有很大关系,在动态代理和工厂模式上都有,以后复习。

同时调用其他静态方法

M:很好,你的功底不错,那你写个线程安全,又可以按需创建的单例模式

Z:张小二,提笔写到,

package 单例模式;

 class Singleton2 {

     private Singleton2()
     {
         System.out.println("对象创建了");
     }
     private static class Sigleton2Holder
     {
         private static Singleton2 instance=new Singleton2();

     }
     public static Singleton2 getInstance()
     {
         return Sigleton2Holder.instance ;

     }

}
 public class Test6
 {
     public static void main(String args[])
     {

         Singleton2 s1=Singleton2.getInstance();
         Singleton2 s2=Singleton2.getInstance();
         if(s1==s2)
         {
             System.out.println("对象时一样的");
         }
         else
         {
             System.out.println("对象时不一样的");
         }

     }

 }

M:你很牛逼啊我问你这个你是怎么解决一个类只创建一个实例的

z:我使用一个静态内部类,专门用来获得对象,对于内部类,他的静态变量只出初始化一次,但是我保证了只有调用getinstace的时候进行初始化。

(此处需要复习内部类)

下篇单例模式,主要结合多线程讲解,博大精深啊

http://www.cnblogs.com/coffee/archive/2011/12/05/inside-java-singleton.html

张小二求职 之单例模式(一)

时间: 2024-11-05 14:57:37

张小二求职 之单例模式(一)的相关文章

张小二求职记之 单例模式(二)

z:大侠,我又回来了. M: 内部类懂了,其实设计模式很多考察的都是基础知识,一个学生能有什么项目工程经验呢?你很上进.咱们聊聊内部类,特别是单例模式中的静态内部类.我们开始吧: M.什么时内部类? 简单来说就是类中有类. M:静态内部类和普通内部类有什么区别? 普通内部类可以理解为外部类的普通方法,需要创建外部对象,说白了普通类是属于某个对象 OutClass.InnerClass obj = outClassInstance.new InnerClass(); 静态内部类可以理解为静态方法,

张小二求职记之 单例模式(三)之决战多线程

M:上回说的多线程的单例模式会了? z;略懂 M:写一个吧 package 单例模式; public class Singleton { private static Singleton instance=null; private Singleton() { System.out.println("单例构造函数"); } public static Singleton getInstance() { if(instance==null) { instance=new Singleto

张小二求职 之 静态工厂方法

工厂:创建对象用的,与单例模式一样,属于创建型模式,如何创建呢? M:好久不见啊,小二,最近又学啥设计模式了?来找我探讨探讨. z:最近看了设计模式中Factory(静态工厂) ,工厂方法,和抽象工厂 M:好啊,那我可要考考你啊.我们聊过单例模式,你这三个设计模式与单例模式什么相同点呢? z:他们都是创建模式,说白了,就是如何创建对象. M:说道如何创建对象,你知道java中创建对象的有哪些方法吗? z:略知一二,1.new不用说2.clone方法,clone不用调用构造函数,直接复制的3.反序

张小二:做一个幸福的胖子

最近听完了单田芳的大唐惊雷.秦琼病重,单田芳在评书中分析: 1.多次负伤 2.心机重,看不开,平时的状态都是一副严肃的表情: 在看程咬金: 每天笑哈哈,有着肥胖的身躯,看似憨厚,实则是"傻中奸",到老一辈的时候基本就剩下他和李世民: 一位作家,到内蒙古去采风,正沉醉于辽阔的大草原,他看一个牧民,躺在草地中,望着天空,一副悠然自得的样子,"原来是这样啊",作家喃喃自语. 随遇而安 僧人修炼石艰苦的吗?穿草鞋,吃斋饭,青灯古佛,他们活着有什么意思呢? 修道的目的是愉悦之

【好文转载c++】 sizeof 使用的经典总结

为了在人面前畅快的吹牛逼,你必须学会背后努力  -----张小二. 写在转载之前: sizeof到底是多少?本来我没有关注,只是有次室友问了我几个sizeof的问题,我被问住了,他当时问我了sizeof(a);是数组,则是数组的字节大小, 如果  void  fun(int a[],int len) {    cout<<sizeof(a)<<endl;//是多少呢,退化为指针,是32位. }   首先你看看http://blog.163.com/[email protected]

LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据 (转)

http://www.cnblogs.com/yukaizhao/archive/2010/05/13/linq_to_sql_1.html LINQ和 LINQ to SQL 都已经不是一个新事物了,但是我接触的比较晚,本着绝知此事要躬行的态度,决定写这个系列. 本文使用的测试环境是VS 2010,和sql server 2005数据库. 1.  从CUD开始,如何使用LINQ  to SQL插入.修改.删除数据 2.  查询 使用LINQ to SQL做简单查询 3.  查询 延迟加载与立即

找工作感悟

找了好久的工作,大约1个月了,才发现自己是多菜,虽然很努力,但是依然无法找到合适的企业,好担心,万事开头难,我张小二不会被打倒的,以后努力的方向应当和企业需求相符合,而不是闭门造车,在找工作的大军中,感到自己的渺茫,所以很想安心在南京找个合适的工作,不断稳步的成长, 有胆量,不要怂,多上机实践,不要一味看书,以后专供java研发,不断深入,形成体系,为成为一名架构师而奋斗终生.

主持会议的八大戒条

其实总结起来:1.会前:准备充分,不能对自己的材料都说不清.2.会上:控制节奏,调动大家讨论,不跑题,做好记录.3.会后:做好纪要,发给与会者. 出差到日本,亲身参加了与日本人一起的研修报告会,技术报告会,开发报告会,总结会.经过这么多次的会议,虽然疲惫异常,但也颇有些心得.这里整理一下,分享给博友们.我认为这是通学,无论处于什么职位,做什么方向的作业,都可能用得到的.    戒条一.不要召开没有准备的会议 场景:王小一带了一堆的PPT和文件资料跑到日本,有自己写的有别人写的,都是匆忙写好的,没

左手Mongodb右手Redis 第三章mongdb操作

mongodb查询操作 1.查询操作 db.getCollection('example_data_1').find({})  查询所有的信息,相当于mysql中的select * from table_name; 2.查询特定条件的就需要在 db.getCollection('example_data_1').find({})中find({})中大括号中设定条件    # 查询在集合example_data_1中,年龄在21和25之间的信息. 1 db.getCollection('examp