面向对象核心思想和单例模式

引言

面试中经常会问到面向对象的思想,比如封装、继承、多态什么的,如果基础好的话,还问顺便问下设计模式,问的最多的有单例模式。看了《大话设计模式》和《Java编程思想》的相关内容后,对此做一个读书笔记。

面向对象核心思想

面向对象的核心思想,基本上都可以说出来,封装、继承、多态

方法重写和多态

记得我之前回答面试问题,什么是多态?总答的是某个类中的一个方法由不同的参数数量和类型的改变,从而实现了不同的功能,这就是多态的体现。
其实我这个回答,答对了一半。但是又混淆了方法重载方法重写。我实际回答的是方法重写,而多态是要和继承关系扯上联系的。
简短来说,就是子类重载了父类的非private (包含public和protected)方法,在实例化父类时可以用子类实例化,发生了向上转型,同时子类用自己的内容实现了父类的对应方法。
这么说对于不懂多态的人有点绕,下面引用下《大话设计模式》的三个要点。

第一,子类以父类的身份出现
第二,子类在工作时以自己的方式实现
第三,子类以父类的身份出现时,子类特有的属性和方法不可以使用。

子类乔装成父类,对外无法看出是子类还是父类

单例模式

单例模式的定义为单例对象的类必须保证只有一个实例存在
那么为什么要这样呢?

比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理

OOP编程中的各种访问限定符,继承、多态的关系的各种精妙的组合,构成了不同的设计模式,来满足我们的设计需求。
最简单的实现单例模式的思路是,让这个类的构造函数为私有的,并且实现一个静态方法对外返回其唯一实例。

public class Singleton {
    private static Singleton singleton = null;
    private Singleton() {  }
    public static Singleton getInstance() {
        if (singleton== null) {
            singleton= new Singleton();
        }
        return singleton;
    }
}

1.私有(private)的构造函数,表明这个类是不可能形成实例了。这主要是怕这个类会有多个实例。
2.即然这个类是不可能形成实例,那么,我们需要一个静态的方式让其形成实例:getInstance()。注意这个方法是在new自己,因为其可以访问私有的构造函数,所以他是可以保证实例被创建出来的。
3.在getInstance()中,先做判断是否已形成实例,如果已形成则直接返回,否则创建实例。 4 .所形成的实例保存在自己类中的私有成员中。 我们取实例时,只需要使用Singleton.getInstance()就行了。

实际应用

在实际应用中,由于多线程的问题,会对简单实现的单例模式有所改写,这就让读者自己去探索。

参考:

《大话设计模式》
《Java编程思想》
https://en.wikipedia.org/wiki/Singleton_pattern
http://coolshell.cn/articles/265.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章