设计模式

1、java接口、抽象类的好处

依赖倒置原则:

     A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。

    B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

抽象是稳定的,实现的变化不会影响到抽象的调用,因为调用的是抽象的方法,所以修改实现时候不需要修改调用的语句。

举个例子:两数相加的例子,相加的数据来源于读取文件的类,这样做并不是很好,因为如果我的数据不是文件里的了,而是在数据库里,这样的话,为了不影响你现有的代码,你就只能将你的Reader类整个改头换面。

或者还有一种方式就是,你再添加一个DBReader类,然后把你所有使用Reader读取的地方,全部手动替换成DBReader,这样其实也还可以接受,那假设我有的从文件读取,有的从数据库读取,有的从XML文件读取,有的从网络中读取,有的从标准的键盘输入读取等等。

这时候就需要抽象接口来实现了?

所以我们最好的做法就是抽象出一个抽象类或者是接口,来表述数据读取的行为,然后让上面所有的读取方式所实现的类都实现这个接口,而我们的客户端,只使用我们定义好的接口,当我们的实现变化时,我只需要设置不同的实际类型就可以了,这样对于系统的扩展性是一个大大的提升。

针对上面简单的数据读取,我们可以定义如下接口去描述。

public interface Reader{                                                                                                 public int getA();                                                                                                                   public int getB();                                                                                                             }

而当使用不同的方法去读取数据的时候,我们就可以写出DBReader、FileReader、XMLReader、NetReader 让我们原来的Reader改名为FileReader去实现这个接口,这样计算器就依赖于抽象的接口,这个依赖是非常稳定的,因为不论你以后要从哪读取数据,你的两个获取数据的方法永远都不会变。

这样,我们让DBReader,XMLReader,NETReader,StandardOutPutStreamReader等等,都可以实现Reader这个接口,而我们的客户端调用依赖于一个Reader,这样不管数据是从哪来的,我们都可以应对自如,因为我根本不关心你是什么Reader,我只知道你能让我获得A和B这两个值就行了。

这便是我们依赖于抽象所得到的灵活性,这也是JAVA语言的动态特性给我们带来的便利

2、双重校验锁的懒汉模式

public class Singleton {  

    private static volatile Singleton instance = null;  

    private Singleton(){}  

    public static Singleton getInstance() {  

        if (instance == null) {  

            synchronized (Singleton.class) {  

                if (instance == null) {  

                    instance =new Singleton();  

                }  

            }  

        }  

        return instance;  

    }  

}  

你可能感兴趣的:(设计模式)