单例模式:用于Runtime,Calendar和其他的一些类中
工厂模式:用于各种不可变的类中,如Boolean
观察者模式:用于Swing和多个事件监听类中
装饰器模式:用于多个JavaIO类中
设计模式是世界上各种程序员用来解决特定实际问题的尝试和测试的方法,设计模式是代码可用性的延申
单例模式重点在于在整个系统上共享一些创建时比较耗费资源的对象。整个应用中只维护一个特定类的实力,他被所有的组件共同使用。Java.lang.Runtime是单例模式中的经典例子。从Java5开始就可以使用枚举来实现线程安全的单例,饿汉式就是线程安全的
java5前:
//由于直接在方法上添加synchronized,开销比较大,所以使用双重检查锁
public class Singlet(){
private static Singlet singlet;
private Singlet(){};
public static Singlet getSinglet(){
if(singlet == null){
synchronized(Singlet.class){
if(singlet == null){
singlet = new Singlet();
}
}
}
}
}
java5后:
可以将枚举Type看作一个类,A为Type的实例
public enum Type {
A;
public void hello(){
System.out.println("HELLO!!!");
}
}
观察者模式基于对象的状态变化和观察者的通讯,以便他们做出相应的操作。简单的例子就是一个天气系统,当天气变化时必须在展示给公众的试图中进行反应,这个视图对象就是一个主题,而不同的视图就是观察者
工厂模式最大的好处就是增加了创建对象时的封装层次。如果使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何的修改
装饰模式增强了单个对象的能力。JavaIO到处都使用了装饰模式,典型例子就是Buffered系列类,如BufferedReader和BufferedWriter,它增强了Reader和Writer对的,以实现提升性能的Buffer层次的读取和写入
Java中不能从静态上下文中访问非静态数据是因为非静态变量是跟具体的对象实例关联的,而静态的却没有和任何的实例进行关联
设计金融系统来说,必须知道它们应该在任何情况下都可以正常工作,不管是断电还是其他情况,所以ATM应该保持正确的状态(事务),比如加锁、事务、错误条件、边界条件等等。
如果看到一个类的不同实现有着不同的方式来做同一件事情,那么就应该用重写。而重载使用不同的输入做同一件事情,Java中,重载的方法签名不同,而重写并不是
接口和抽象类都遵循“面向接口而不是实现编码”的设计原则,可以增加代码的灵活性,可以适应不断变化的需求。
在Java中,你只能继承一个类,但可以实现多个接口,所以一旦继承了一个类,你就失去了继承其他类的机会。
接口通常用来表示附属描述或行为如:例如Runable、Clonable、Serializable等等,所以如果这些类是抽象类,那么你的类就不能不是去继承,但这些类是接口,所以你的类可以同时拥有多种不同的行为。
在一些对时间要求比较高的应用中,更倾向使用抽象类,因为他比接口稍微快一些。如果希望把一系列的行为都规范在类继承层次里面,并且可以更好地在同一个地方进行编码,那么使用抽象类是一个更好的选择。有时,接口和抽象类可以一起使用,接口中定义函数,而抽象类中定义默认的实现。