每多学一点知识,多一份精彩与快乐!

探索设计模式之六——单例模式(转)


单例模式(Singleton Pattern)
前面说提到的五种创建模式,主要解决的问题是如何创建对象,获得产品。而单例模式最要关心的则是对象创建的次数以及何时被创建。

Singleton模式可以是很简单的,它的全部只需要一个类就可以完成(看看这章可怜的UML图)。但是如果在“对象创建的次数以及何时被创建”这两点上较真起来,Singleton模式可以相当的复杂,比头五种模式加起来还复杂,譬如涉及到DCL双锁检测(double checked locking)的讨论、涉及到多个类加载器(ClassLoader)协同时、涉及到跨JVM(集群、远程EJB等)时、涉及到单例对象被销毁后重建等。对于复杂的情况,本章中会涉及到其中一些

目的:

希望对象只创建一个实例,并且提供一个全局的访问点。

场景:

Kerrigan对于Zerg来说是个至关重要的灵魂人物,无数的Drone、Zergling、Hydralisk……可以被创造、被牺牲,但是Kerrigan得存在关系到Zerg在这局游戏中的生存,而且Kerrigan是不允许被多次创造的,必须有且只有一个虫族刀锋女王的实例存在,这不是游戏规则,但这是个政治问题。

分析:

如前面一样,我们还是尝试使用代码来描述访问Kerrigan的过程,看看下面的UML图,简单得我都不怎么好意思放上来占版面。

图6.1 单例模式的UML图

Continue Reading

Java学习笔记 第十一季


1.接口中所声明的方法都是抽象方法。接口中的方法都是public的。

2.接口中也可以定义成员变量。接口中的成员变量都是public,final,static的。

3.一个类不能即是final,,又是abstract的。因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,这样abstract希望该类可以被继承而final明确说明该类不能被继承,两者矛盾。因此一个类不能即是final的,又是abstract的。

4. Desing Pattern(设计模式)。单例模式(Singleton):表示一个类只会生成唯一的一个对象。

5.包(package)。用于将完成不同功能的类分门别类,放在不同的目录(包)下。包的命名规则:将公司域名反转作为包名,对于包名:每个字母都需要小写。如果定义类的时候没有使用package,那么java就认为我们所定义的类位于默认包里面(default package)。

6.编译带有package声明的java源文件有两种方式:

一.直接编译,然后根据类中所定义的包名,逐一手工建立目录结构,最后将生成的class文件放到该目录结构中。

二.使用编译参数 -d,方式为:javac -d .源文件.java,这样在编译后,编译器会自动帮助我们建立好包所对应的目录结构。

三.执行通过java 目录.class文件。

7.有两个包名,分别是aa.bb.cc与aa.bb.cc.dd,那么我们称后者为前者的子包。

8.导入(import),将使用package分离的各个类导入回来,让编译器能够找到所需要的类。

9.import的语法:import com.csssea.PackageTest;

10.import con.csssea.* ,表示导入com.csssea包下面的所有类。

11.import aa.bb.* 并不会导入aa.bb.cc包下面的类。这时需要这样写:

import aa.bb.*;

import aa.bb.cc.*;

12.关于package,import,class的顺序问题:

一.首先需要定义包(package),可选。

二.接下来使用import进行导入,可选。

三.然后才是class或interface的定义。

13.如果两个类在同一个包下面,那么则不需要导入,直接使用即可。

14.访问修饰符(access modifier)。

1) public(公共的):被public所修饰的属性和方法可以被所有类访问。

2)protected(受保护的):被protected所修饰的属性和方法可以在类内部,相同包以及该类的子类访问。

3) private(私有的):被private所修饰的属性和方法只能在该类内部使用。

4)默认的(不加任何访问修饰符):在类内部以及相同包下面的类所使用。

Continue Reading


清晨,坐着学校老爷车,去奥体中心干活。

有时候这老爷车,闯红灯,换5,6档,油门踩到极限。严重违反交通制度。

开始大家对这些行为都不理解,还以为老师傅拿生命开玩笑。(PS:这位老师傅是我们学校教练)

后来通过同学在车上的一番询问老师傅,得知,这辆校车,开了14年了,明年没审车的资格了。

“14年了 “  当听到老师傅在车上说这句话,从师傅眼里能看出,师傅很舍不得这辆老爷车报销。

今晨,还是坐这这辆老爷车,车上正放着80年代的歌曲……车上的同学亦如的安静,欣赏着。

每当坐着这辆车去奥体中心干活时。都使我感觉一股浓浓的情意味。

情啊…..情啊…….情啊…….情啊……

我想对待自己的爱好,职业规划,感情甚至许许多多生活中的事儿,我也因该像师傅一样,热衷….并努力去实现着,追着,奋斗着。

2011第五届年会 开始啦! 再此支持一下! – WebReBuild.org


WebReBuild.ORG第五届年会——重构七年

2011年WebReBuild再度出发!

如果您对前端技术有兴趣,如果您支持W3C与WebRebuild,如果您喜欢前端技术并热爱重构,快来报名参加吧!
本小站支持一下!

第十季 面向对象之多态(polymorphism)


 第十季 面向对象之多态(polymorphism)

  1. 多态:我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思就是:父类型的引用可以指向子类的对象。
  2. Parent p = new Child();当使用多态调用方法时,首先检查父类中是否有sing()方法,如果没有则编译出错,如果有,再去调用哪个子类的sing()方法。
  3. 一共有两种类型的强制类型转换:

a)   向上类型转换(upcast):比如说:将Cat类型转换成Animal类型,将子类型转换为父类型。对于向上类型转换,不需要显式

b)   向下类型转换(downcast):比如说将Animal类型转换成Cat类型,即将类型转换为子类型,对于向下类型转换,必须要显示指定(必须要使用强制类型转换)。

  1. instanceof运算符

     instanceof运算符的作用:在强制类型转换之前,首先判断前一个对象是否是后一个类的实例,是否可以成功地转换,从而保证代码更加健壮。

例如:

     Object hello = “疯狂的鱼”;

     If(object instanceof String)

     {

           System.out.println(“类型符合”);

}

  1. 抽象类(abstract class):

使用abstract关键字所修饰的类叫做抽象类。抽象类无法实例化,也就是说,不能new出来一个抽象类的对象(实例)。

  1. 抽象方法(abstract method):

使用abstract关键字说修饰的方法叫做抽象方法。抽象方法需要定义在抽象类中定义。相对于抽象方法,之前说定义的方法叫做具体方法(有声明,有实现)。

  1. 如果一个类包含了抽象方法,那么这个类一定是抽象类。
  2. 如果某个类是抽象类,那么该类可以包含具体的方法(有声明,有实现)。
  3. 如果一个类中包含了抽象方法,那么这个类一定要声明成abstract class ,也就是说,该类一定是一个抽象类;反之,如果某个类是抽象类,那么该类既可以包含抽象方法,也可以包含具体方法。

10.无论何种情况,只要一个类是抽象类,那么这个类就无法实例化。

11.在子类继承父类(父类是个抽象类)的情况下,那么该子类必须要实现父类中所定义的所有抽象方法;否则,该子类需要声明一个abstract class。

第九季 面向对象之继承(inheritence)


第九季 面向对象之继承(inheritence)

  1. 继承:表示父子关系,Java是单继承的,它表示一个类只能从另一个类继承(被继承的类叫做父类(基类base class)继承的类叫做子类),Java中的继承使用extends关键字。
  2. 当生成子类对象时,Java默认首先调用父类的不带参数的构造方法。然后执行该构造方法,然后生成父类对象,接下来,再去调用子类的构造方法,生成子类的对象。(要想生成子类的对象,首先需要生成父类的对象,没有父类对象就没有子类对象,比如说:没有父亲,就没有孩子)。
  3. super关键字:super表示对父类对象的引用。this 表示对当前自己对象的引用。
  4. 如果子类使用super()显示调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法,而不会再去寻找父类的布袋参数的构造方法。与this 一样,super也必须要作为构造方法的第一条执行语句,前面不能有其他可执行语句。
  5. 关于继承的3点:

a)   父类有的,子类也有。

b)   父类没有的,子类可以增加。

c)   父类有的,子类可以改变。

  1. 关于继承的注意事项

a)   构造方法不能被继承

b)   方法和属性可以被继承

c)   子类的构造方法隐式地调用父类的不带参数的构造方法。

d)   当父类没有不带参数构造方法时,子类需要使用super来显式地调用父类的构造方法,super指的是对父类的引用,super关键字必须是构造方法中的第一行语句。

7.方法重写(override):又叫做覆写,子类与父类的方法返回类型一样,方法名称一样,参数一样,这样我们说子类与父类的方法构成了重写关系。

8.方法重写与方法重载之间的关系:重载发生在同一个类内部的两个或多个方法。重写发生在父类与子类之间。

9.当两个方法形成重写关系时,可以在子类方法中通过super.run()形式调用父类的run() 方法,其中super.run()不比放在第一行语句,因此此时对象已经构造完毕,先调用父类的run() 方法还是先调用子类的run()方法是根据程序的逻辑决定的。

10.       在定义一个类的时候,如果没有显示指定该类的父类,那么该类就会继承于Java.lang.Object类(JDK提供的一个类,object类是Java中所有类的直接和间接父类)。

第八季 面向对象之封装


第八季 面向对象之封装 二

  1. 类中的属性又叫做成员变量(member ariable),属性用英文表示为property或者attribute。
  2. 对象(object)又叫做实例(instance),生成一个对象的过程又叫做类的实例化。
  3. 命令约定

a)   类:首字母大写,如果一个类名由多个单词构成,那么每个单词的首字母都大写,而且中间不使用任何的连接符,比如:Person类,MemberTest类。

b)   方法:首字母小写。如果一个方法由多个单词构成,那么第一个单词的所有字母全都小写,从第二个单词开始,每个单词的手写字母大写。比如:add,addThreeInt。

c)   属性:命令约定与方法相同。比如说:age,ageOfPerson。

4.属性需要定义在类中,又叫做成员变量;而定义在方法中的变量叫做局部变量。

5. 如何定义属性?

   public class Person

   {

              修饰符 类型 属性名称;

}

   如何使用属性? 与方法一样,使用.运算符。首先需要生成类的实例,然后使用实例+“.”的方式来使用属性。

比如:

        Person person = new person();

        person.age;

6. 局部变量(定义在方法中的变量)使用前必须要声明并赋初值。成员变量使用前必须要声明,但可以不赋初值。

7. 成员变量与局部变量的联系与区别:

   a) 无论是成员变量还是局部变量,使用前都需要声明(定义)。

   b) 对于局部变量来说,使用前必须要初始化,对于成员变量来说,使用前可以不初始化。如果没有初始化成员变量就开始使用,那么每个类型的成员变量都有一个默认的初始值。

   1) byte , short ,int long 类型的初始值为 0 ;

   2) float,double 类型的初始值为0.0

   3) char类型的初始值 ‘\u0000’

   4) Boolean 类型的初始值为 false

8.引用类型(reference type):引用类型是用在对象上的。一个对象可以被多个引用所指向,但同一时刻,每个引用只能指向唯一的一个对象,如果一个对象被多个应用所指向。那么无论哪个引用对象的属性进行了修改,都会反映到其他的引用当中。

Continue Reading

较老的文章 较新的文章

About CarzyFish

Search

腾讯微博

Google Friend

联盟站点